Jaka jest różnica między listą KeyValuePair a słownikiem dla tych samych typów? Czy jest odpowiedni czas, aby użyć jednego lub drugiego?
Jaka jest różnica między listą KeyValuePair a słownikiem dla tych samych typów? Czy jest odpowiedni czas, aby użyć jednego lub drugiego?
Odpowiedzi:
Kiedy nie potrzebujesz szybkiego wyszukiwania klucza - utrzymanie tablicy hashy używanej przez Dictionary
ma pewien narzut.
Krótko mówiąc, lista nie wymusza unikalności klucza, więc jeśli potrzebujesz tej semantyki, to powinieneś użyć.
Słownik to typ ogólny, który zawiera kolekcję par klucz-wartość. Słownik jest szybki dla operacji wyszukiwania, ponieważ wewnętrznie używa funkcji skrótu . Oznacza to, że wszystkie klucze muszą być unikalne w słowniku .
Rozważ te przykłady:
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.
Dlatego zawsze powinieneś wziąć pod uwagę co najmniej dwie rzeczy:
Lista byłaby również przydatna, gdy zależy Ci na kolejności przedmiotów.
Zgodnie z odpowiedzią Phillipa Ngana, SOAP lub innym, nie można serializować XML obiektów, które implementują IDictionary.
P: Dlaczego nie mogę serializować tabel skrótów?
Odp .: XmlSerializer nie może przetwarzać klas implementujących interfejs IDictionary. Wynikało to częściowo z ograniczeń harmonogramu, a częściowo z faktu, że obiekt hashy nie ma odpowiednika w systemie typu XSD. Jedynym rozwiązaniem jest zaimplementowanie niestandardowej tablicy haszującej, która nie implementuje interfejsu IDictionary.
W usługach sieciowych SOAP dla Silverlight odkryliśmy, że Dictionary nie są serializowane. Byłaby to sytuacja, w której użyłbyś listy KeyValuePair zamiast słownika.
.
Z http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
kontraDictionaryEntry
[Krzysztof Cwalina]Omówiliśmy problem z implementacją
IEnumerable
onDictionary<K,V>
. Jaki typ powinienIEnumerable.GetEnumerator().Current
zwrócić?KeyValuePair<K,V>
czyDictionaryEntry
? To samo dotyczyICollection.CopyTo
. Wystąpienia jakiego typu należy skopiować do tablicy?Zdecydowaliśmy, co następuje:
IEnumerable
iICollection
implementacje interfejsu będą używaćKeyValuePair<K,V>
jako typu elementu.IDictionary
określeni członkowie (GetEnumerator
powracającyIDictionaryEnumerator
) będą używaćDictionaryEntry
jako typu elementu.Powodem jest to, że jesteśmy w trakcie wprowadzania zmian, które
IEnumerator<T>
mogłyby się rozszerzyćIEnumerator
. Byłoby bardzo dziwne, gdybyśmy przechodząc po hierarchii odDictionary<K,V>
->IEnumerable<T>
->IEnumerable
nagle zmienili typ pozycji zwracanej z wyliczaczy.