İstisna bir seçenek olmadığında, Aramaya gidin
Bir yapı kadar verimli bir yapı elde etmeye çalışıyorsanız, Dictionary
ancak girişte yinelenen bir anahtar olmadığından emin değilseniz Lookup
, daha güvenlidir.
Başka bir cevapta belirtildiği gibi, null anahtarları da destekler ve rastgele verilerle sorgulandığında her zaman geçerli bir sonuç döndürür, bu nedenle bilinmeyen girdiye daha dirençli görünür (istisnaları yükseltmek için Sözlük'ten daha az eğilimli).
Ve özellikle System.Linq.Enumerable.ToDictionary
işlevle karşılaştırırsanız doğrudur :
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
Alternatif, bir foreach
döngü içine kendi yinelenen anahtar yönetimi kodunu yazmak olacaktır .
Performans değerlendirmeleri, Sözlük: açık kazanan
Bir listeye ihtiyacınız yoksa ve çok sayıda öğeyi yönetecekseniz Dictionary
(hatta kendi özel uyarlanmış yapınız) daha verimli olur:
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
Lookup
Her anahtar için bir öğe listesi bulundurması gerektiği gibi , Sözlük'ten daha yavaştır (çok sayıda öğe için yaklaşık 3 kat daha yavaştır)
Arama hızı: Oluşturma: 00: 00: 01.5760444
Sözlük hızı: Oluşturma: 00: 00: 00.4418833