Порядок элементов в словаре - PullRequest
91 голосов
/ 24 октября 2010

Мой вопрос о перечислении элементов словаря

// 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 ]

109 голосов
/ 24 октября 2010

Порядок элементов в словаре недетерминирован. Понятие порядка просто не определено для хеш-таблиц. Поэтому не полагайтесь на перечисление в том же порядке, в котором элементы были добавлены в словарь. Это не гарантировано.

Цитата из документа :

Для целей перечисления каждый элемент в словаре рассматривается как структура KeyValuePair<TKey, TValue>, представляющая значение и его ключ. Порядок возврата товаров не определен.

23 голосов
/ 20 августа 2011

Вы всегда можете использовать SortedDictionary для этого.Обратите внимание, что словарь упорядочен по Key по умолчанию, если не был указан компаратор.

Я скептически отношусь к использованию OrderedDictionary для того, что вы хотите, так как документация говорит, что:

Элементы OrderedDictionary не сортируются по ключу, в отличие от элементов класса SortedDictionary.

23 голосов
/ 24 октября 2010

Если вы хотите упорядочить элементы, используйте OrderedDictionary .Обычный hastable / dictionary упорядочен только в некотором смысле макета хранилища.

11 голосов
/ 14 августа 2014

Для 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;
}

Элементы возвращаются в порядке их добавления.

11 голосов
/ 24 октября 2010

Элементы будут возвращены в том порядке, в котором они физически хранятся в словаре, что зависит от хеш-кода и порядка добавления элементов.Таким образом, порядок будет казаться случайным, и, поскольку реализации меняются, вы никогда не должны зависеть от того, чтобы порядок оставался прежним.

Вы можете заказать элементы при перечислении их:

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) {
  ...
}
4 голосов
/ 24 октября 2010

Ассоциативные массивы (иначе, хеш-таблицы) неупорядочены, что означает, что элементы могут быть упорядочены любым мыслимым образом.

ОДНАКО вы можете получить ключи массива (только ключи), упорядочив их в алфавитном порядке(через функцию сортировки), а затем поработаем над этим.

Я не могу дать вам образец C #, потому что я не знаю языка, но этого должно быть достаточно для того, чтобы вы продолжали сами.

...