2009-03-05 19 views
7

Dizideki benzersiz değerleri sayma konusunda sorun yaşıyorum ve bunu dizi öğelerini yeniden düzenlemeden yapmam gerekiyor.Dizi öğelerini yeniden düzenlemeden bir dizideki benzersiz sayıları nasıl sayabilirim?

Bunu nasıl yapabilirim?

int numberOfElements = myArray.Distinct().Count(); 

Sigara LINQ:

+1

mı? –

+0

o o kinda; P .... – jarus

+0

Ev ödevi ile ilgili bir sorun yok ... Birisi sadece cevapları olduğu gibi almıyor. (yani, cevabı alın ve daha iyi hale getirin *). – Arafangion

cevap

15

Eğer .NET 3.5 varsa kolayca aracılığıyla LINQ ile bunu başarabilirsiniz

List<int> uniqueValues = new List<int>(); 
for(int i = 0; i < myArray.Length; ++i) 
{ 
    if(!uniqueValues.Contains(myArray[i])) 
     uniqueValues.Add(myArray[i]); 
} 
int numberOfElements = uniqueValues.Count; 
+0

Eğer bu bir ev ödevi sorusuysa, o zaman cevap ona pek çok puan almak için değil, yine de linq açısından iyi bir cevaptır. – andleer

+0

@Andrew LINQ olmayan bir ödev örneği ekledi. –

+0

Non-linq örneği gerçekten çok kötü, ama bir ev ödevi sorusu ise Rich B'nin daha iyi bir çözüm bulmasına izin verelim. :) (İPUCU: Her öğe için tüm dizi boyunca yineleme yapmaktan kaçının mı?) – Arafangion

6

Bu çok daha verimli olmayan LINQ uygulamasıdır.

 var array = new int[] { 1, 2, 3, 3, 3, 4 }; 
     // .Net 3.0 - use Dictionary<int, bool> 
     // .Net 1.1 - use Hashtable 
     var set = new HashSet<int>(); 
     foreach (var item in array) { 
      if (!set.Contains(item)) set.Add(item); 
     } 
     Console.WriteLine("There are {0} distinct values. ", set.Count); 
+0

yerine neden? – sharptooth

+0

Performans bilge ikisi de aynı olmalı, HashSet'i kullanacak şekilde temizleyecektir, bu demo kodu daha az çirkin görünüyor –

+0

Sözlük, içerdiği Liste'den daha büyük dizilerde çok daha hızlı olmalıdır. –

0

sadece ayrı değer sayılmalıdır veya dizideki her bir numara (örneğin, "sayısı 5 3 kez içerdiği") sayılmalıdır? İkinci gereksinim, sayma sıralama algoritmasının başlangıç ​​adımları ile yerine getirilebilir.

  • inşa Dizin/Anahtar
  • kilit anahtarının tekrarlarını sayısını tutan bir değişkene bağlı olduğu sayılmasına eleman bir dizi:
    Böyle bir şey olurdu eleman
  • (dizi [göstergesi])
dizi anahtarın
  • artış değeri yineleme Bu ödev

Selamlar

1

O (n) çalışma süresi MAX_VALUE bellek kullanımı

boolean[] data = new boolean[maxValue]; 
for (int n : list) { 
    if (data[n]) counter++ 
    else data[n] = true; 
} 
İlgili konular