Порядок элементов в словаре
Мой вопрос о перечислении элементов словаря
// 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));
}
В каком порядке будут перечислены элементы? Могу ли я заставить порядок быть в алфавитном порядке?
Ответы
Ответ 1
Порядок элементов в словаре не является детерминированным. Понятие порядка просто не определено для hashtables. Поэтому не полагайтесь на перечисление в том же порядке, что и элементы, добавленные в словарь. Это не гарантировано.
Введите из документа:
Для целей перечисления каждый элемент в словаре рассматривается как структура KeyValuePair<TKey, TValue>
, представляющая значение и его ключ. Порядок возврата элементов undefined.
Ответ 2
Если вы хотите упорядочить элементы, используйте OrderedDictionary. Обычный hastable/dictionary упорядочен только в некотором смысле макета хранилища.
Ответ 3
Вы всегда можете использовать SortedDictionary
для этого. Обратите внимание, что словарь упорядочен по ключу по умолчанию, если не был указан компаратор.
Я скептически отношусь к использованию OrderedDictionary
для того, что вы хотите, так как документация говорит, что:
Элементы OrderedDictionary не сортируются по ключу, в отличие от элементов класса SortedDictionary.
Ответ 4
Элементы будут возвращены в порядке их физического хранения в словаре, что зависит от хеш-кода и порядка добавления элементов. Таким образом, порядок будет казаться случайным, и по мере изменения реализации вы никогда не должны зависеть от того, остался ли тот же порядок.
Вы можете заказать элементы при их перечислении:
foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) {
...
}
В рамках 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) {
...
}
Ответ 5
Для упорядоченного словаря:
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;
}
Элементы возвращаются в том порядке, в котором они добавлены.
Ответ 6
Ассоциативные массивы (ака, хеш-таблицы) неупорядочены, что означает, что элементы могут быть упорядочены любым способом.
ОДНАКО, вы можете получить ключи массива (только ключи), заказать в алфавитном порядке (через функцию сортировки), а затем работать над этим.
Я не могу дать вам образец С#, потому что я не знаю языка, но этого должно быть достаточно, чтобы вы могли продолжить.