Мой вопрос касается перечисления элементов словаря
// 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));
}
В каком порядке будут перечислены элементы? Могу ли я сделать порядок в алфавитном порядке?
c#
.net
dictionary
ienumerable
Капитан Комикс
источник
источник
Ответы:
Порядок элементов в словаре недетерминированный. Для хэш-таблиц понятие порядка просто не определено. Поэтому не полагайтесь на перечисление в том же порядке, в котором элементы были добавлены в словарь. Это не гарантировано.
Цитата из документа :
источник
Если вы хотите, чтобы элементы были упорядочены, используйте OrderedDictionary . Обычный hastable / словарь заказывается только в некотором смысле схемы хранения.
источник
Вы всегда можете использовать
SortedDictionary
для этого. Обратите внимание, что словарь по умолчанию упорядочен по ключу, если не указан компаратор.Я скептически отношусь к использованию того,
OrderedDictionary
что вы хотите, поскольку в документации говорится, что:источник
SortedDictionary<K,V>
оно реализовано в виде двоичного дерева поиска, что придает его операциям разную временную и пространственную сложность по сравнению с хеш-таблицейDictionary<K,V>
. Если пользователям нужнаO(1)
структура хэш-таблицы вставки / удаления, а также они хотят перебирать элементы в порядке ключей, тогда они должныdict.Keys.OrderBy( k => k ).Select( k => dict[k] )
вместо этого (за счетO(n)
пространства иO( n log n )
времени) дляOrderBy()
(что потребуется для буферизации всей коллекции ключей во внутреннем списке ).Элементы будут возвращены в том порядке, в котором они физически хранятся в словаре, который зависит от хэш-кода и порядка добавления элементов. Таким образом, порядок будет казаться случайным, и при изменении реализаций вы никогда не должны зависеть от порядка, оставшегося неизменным.
Вы можете упорядочить позиции при их перечислении:
В framework 2.0 вам сначала нужно будет поместить элементы в список, чтобы отсортировать их:
источник
Для упорядоченного словаря:
Элементы возвращаются в том порядке, в котором они были добавлены.
источник
Ассоциативные массивы (также известные как хеш-таблицы) неупорядочены, что означает, что элементы можно упорядочивать любым возможным способом.
ОДНАКО, вы можете получить ключи массива (только ключи), упорядочить их в алфавитном порядке (с помощью функции сортировки), а затем работать над этим.
Я не могу дать вам образец C #, потому что я не знаю языка, но этого должно быть достаточно, чтобы вы могли продолжить.
источник