Порядок элементов в словаре
мой вопрос о перечислении элементов справочника
// 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));
}
в каком порядке будут перечислены элементы? Могу ли я заставить порядок быть алфавитным?
6 ответов:
порядок элементов в словаре, является недетерминированным. Понятие порядка просто не определено для хэш-таблиц. Поэтому не полагайтесь на перечисление в том же порядке, в каком элементы были добавлены в словарь. Это не гарантировано.
цитата доктор:
для целей перечисления, каждый элемент в словаре трактуется как
KeyValuePair<TKey, TValue>
структура, представляющая значение и его ключ. Порядок, в котором возвращаются товары: не определено.
Если вы хотите упорядочить элементы, используйте OrderedDictionary. Обычный hastable / dictionary упорядочен только в некотором смысле макета хранения.
Я думаю, что я опаздываю на вечеринку, но вы всегда можете использовать
SortedDictionary
для этого. Обратите внимание, что дисковод по умолчанию упорядочен по ключу, если не указан компаратор.Я скептически отношусь к использованию
OrderedDictionary
за то, что вы хотите, так как документация говорит, чтоэлементы OrderedDictionary не сортируются по ключу, в отличие от элементы класса SortedDictionary.
для OrderedDictionary:
var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary(); _OrderedDictionary.Add("testKey1", "testValue1"); _OrderedDictionary.Add("testKey2", "testValue2"); _OrderedDictionary.Add("testKey3", "testValue3"); var k = _OrderedDictionary.Keys.GetEnumerator(); var v = _OrderedDictionary.Values.GetEnumerator(); while (k.MoveNext() && v.MoveNext()) { var key = k.Current; var value = v.Current; }
элементы возвращаются в том порядке, в котором они были добавлены.
элементы будут возвращены в том порядке, в котором они физически хранятся в словаре, что зависит от хэш-кода и порядка добавления элементов. Таким образом, порядок будет казаться случайным, и по мере изменения реализаций вы никогда не должны зависеть от того, что порядок остается неизменным.
вы можете заказать элементы при их перечислении:
foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) { ... }
в framework 2.0 вам сначала нужно будет поместить элементы в список, чтобы отсортировать их:
List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary); items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); }); foreach (KeyValuePair<string,string> kvp in items) { ... }
ассоциативные массивы (ака, хэш-таблицы) неупорядочены, что означает, что элементы могут быть упорядочены любым мыслимым способом.
однако вы можете получить ключи массива (только ключи), упорядочить их в алфавитном порядке (с помощью функции сортировки), а затем работать над этим.
Я не могу дать вам образец C#, потому что я не знаю языка, но этого должно быть достаточно для вас, чтобы пойти на себя.