İstisna bir seçenek olmadığında, Aramaya gidin
Bir yapı kadar verimli bir yapı elde etmeye çalışıyorsanız, Dictionaryancak 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.ToDictionaryiş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 foreachdö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);
// ...
LookupHer 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