Moje pytanie dotyczy wyliczenia elementów Słownika
// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
// add values using add
_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");
// add values using []
_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;
// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}
W jakiej kolejności zostaną wyliczone elementy? Czy mogę wymusić alfabetyczny porządek?
c#
.net
dictionary
ienumerable
Kapitan Komiks
źródło
źródło
Odpowiedzi:
Kolejność elementów w słowniku jest niedeterministyczna. Pojęcie porządku po prostu nie jest zdefiniowane dla tabel skrótów. Nie polegaj więc na wyliczaniu w tej samej kolejności, w jakiej elementy zostały dodane do słownika. To nie jest gwarantowane.
Cytat z dokumentu :
źródło
Jeśli chcesz uporządkować elementy, użyj OrderedDictionary . Zwykły hastable / słownik jest uporządkowany tylko w pewnym sensie układu pamięci.
źródło
Zawsze możesz
SortedDictionary
do tego użyć . Zauważ, że słownik jest domyślnie uporządkowany według klucza, chyba że określono element porównujący.Jestem sceptyczny co
OrderedDictionary
do tego, czego chcesz, ponieważ dokumentacja mówi, że:źródło
SortedDictionary<K,V>
jest zaimplementowane jako drzewo wyszukiwania binarnego, co daje jego operacjom różną złożoność czasową i przestrzenną w porównaniu z bazującym na tablicy haszyDictionary<K,V>
. Jeśli użytkownicy potrzebują strukturyO(1)
wstawiającej / usuwającej hashy, a także chcą iterować po elementach w kolejności kluczy, powinnidict.Keys.OrderBy( k => k ).Select( k => dict[k] )
zamiast tego (kosztemO(n)
miejsca iO( n log n )
czasu) dlaOrderBy()
(który będzie musiał buforować całą kolekcję kluczy na liście wewnętrznej ).Elementy zostaną zwrócone w kolejności, w jakiej znajdują się fizycznie w słowniku, która zależy od kodu skrótu i kolejności dodawania elementów. Tak więc kolejność będzie wydawać się losowa, a gdy implementacje się zmieniają, nigdy nie powinieneś polegać na tym, że kolejność pozostanie taka sama.
Możesz zamówić pozycje wyliczając je:
We frameworku 2.0 musiałbyś najpierw umieścić elementy na liście, aby je posortować:
źródło
Dla OrderedDictionary:
Elementy są zwracane w kolejności ich dodania.
źródło
Tablice asocjacyjne (czyli tablice skrótów) są nieuporządkowane, co oznacza, że elementy można uporządkować w dowolny możliwy sposób.
JEDNAK możesz pobrać klucze tablic (tylko klucze), uporządkować je alfabetycznie (za pomocą funkcji sortowania), a następnie nad tym pracować.
Nie mogę dać Ci próbki C #, ponieważ nie znam języka, ale to powinno wystarczyć, abyś mógł kontynuować.
źródło