Dictionary <T1, T2> yerine List <KeyValuePair <T1, T2 >> ne zaman kullanılır?


97

Aynı türler için KeyValuePair Listesi ile Sözlük arasındaki fark nedir? Birini veya diğerini kullanmak için uygun bir zaman var mı?

Yanıtlar:


82

Anahtarda hızlı aramalara ihtiyacınız olmadığında - tarafından kullanılan hashtable'ı sürdürmenin Dictionarybelirli bir ek yükü vardır.


9
Ayrıca liste ekleme işlemi
Sözlük'tekinden

2
Alanları salt okunurdur, ancak listedeki tüm öğeyi her zaman değiştirebilirsiniz.
Pavel Minaev

Daha fazla farklılık burada
Vinni

63

Kısacası, liste anahtarın benzersizliğini zorlamaz, bu nedenle bu anlambilime ihtiyacınız varsa, kullanmanız gereken şey budur.


7
+1 Sözlüğün değerin benzersizliğini de zorlamadığını unutmayın!
gdoron Monica'yı

25

Sözlük, anahtar-değer çiftlerinden oluşan bir koleksiyon içeren genel bir türdür . Sözlük, arama işlemleri için hızlıdır, çünkü dahili olarak karma işlevi kullanır . Bu, tüm anahtarların sözlükte benzersiz olması gerektiği anlamına gelir .

Şu örnekleri düşünün:

List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.

Bu yüzden her zaman en az iki şeyi dikkate almalısınız:

  1. Sözlükteki somut öğeleri aramak ister misiniz?
  2. Benzersiz olmayan bazı alanlara sahip olmak ister misiniz (örneğin çiftler: ad / soyad).

2
Buradaki önemli nokta, List <KeyValuePair> anahtarlarının benzersiz olmaması gereken sözlük anahtarlarının benzersiz olması gerektiğidir.
Bruno Bieri

7
@BrunoBieri List <KeyValuePair> anahtarları benzersiz olmayabilir
Nikhil Vartak

2
2 yıllık yorumunuzu düzelttim ve bunu fark ettiniz. SO'nun neden tek güvenilir ve en popüler Soru-Cevap platformu olduğuna şaşmamalı.
Nikhil Vartak


7

Phillip Ngan'ın cevabına ek olarak, SOAP veya başka türlü, IDictionary uygulayan nesneleri XML serileştiremezsiniz.

S: Hashtable'ları neden serileştiremiyorum?

C: XmlSerializer, IDictionary arabirimini uygulayan sınıfları işleyemez. Bu kısmen zamanlama kısıtlamalarından ve kısmen de bir hashtable'ın XSD tipi sistemde bir karşılığı olmaması gerçeğinden kaynaklanıyordu. Tek çözüm, IDictionary arayüzünü uygulamayan özel bir hashtable uygulamaktır.

buradan


5

Silverlight için SOAP web hizmetlerinde, Dictionary'lerin serileştirmediğini gördük. Bu, bir Sözlük üzerinde KeyValuePair Listesi kullanacağınız bir durum olabilir.

.


3

Gönderen http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePairgenel DictionaryEntry
[Krzysztof Cwalina]

IEnumerableOn uygulamasında bir sorunu tartıştık Dictionary<K,V>. Hangi tür IEnumerable.GetEnumerator().Current dönmelidir? KeyValuePair<K,V>veya DictionaryEntry? Aynı ICollection.CopyTo. Diziye hangi türden örnekler kopyalanmalıdır?

Aşağıdakilere karar verdik: IEnumerable ve ICollectionarayüz uygulamaları KeyValuePair<K,V>öğe türü olarak kullanılacak. IDictionarybelirli üyeler ( GetEnumeratorgeri dönen IDictionaryEnumerator) DictionaryEntrymateryal türü olarak kullanacaktır .

Bunun nedeni, IEnumerator<T>uzanacak bir değişiklik yapma sürecinde olmamızdır IEnumerator. Dictionary<K,V>-> IEnumerable<T>-> ' den hiyerarşide yürümek çok tuhaf olurdu IEnumerable .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.