Сортировка словаря по отношению к ключам
У меня есть словарь на С#, например
Dictionary<Person, int>
и я хочу сортировать этот словарь на месте по отношению к ключам (поле в классе Person). Как мне это сделать? Каждая доступная помощь в Интернете - это список, не содержащий конкретных примеров сортировки словаря. Любая помощь будет высоко оценена!
Ответы
Ответ 1
Вы не можете отсортировать Dictionary<TKey, TValue>
- он неотъемлемо неупорядочен. (Вернее, порядок, в котором извлекаются записи, специфичен для реализации. Вы не должны полагаться на то, что он работает одинаково между версиями, поскольку упорядочение не является частью его разработанных функций.)
Вы можете использовать SortedList<TKey, TValue>
или SortedDictionary<TKey, TValue>
, оба из которых сортируются по ключу (конфигурируемым способом, если вы передаете IEqualityComparer<T>
в конструктор) - могут ли они быть полезными для вас?
Не обращайте внимания на слово "список" в названии SortedList
- это еще словарь, в котором он сопоставляет ключи со значениями. Он реализован с использованием списка внутри, эффективно - поэтому вместо поиска хеш-кода он выполняет двоичный поиск. SortedDictionary
аналогично основан на двоичных поисках, но через дерево вместо списка.
Ответ 2
Попробуйте использовать SortedDictionary
Ответ 3
По дизайну словари не сортируются. Если вам нужна эта возможность в словаре, посмотрите на SortedDictionary.
Ответ 4
Взгляните на SortedDictionary
, там даже перегрузка конструктора, чтобы вы могли перейти в свой собственный IComparable для сравнения.
Ответ 5
Правильный ответ уже указан (просто используйте SortedDictionary).
Однако, если случайно вам нужно сохранить свою коллекцию в качестве Словаря, можно получить доступ к ключам словаря упорядоченным способом, например, заказывая ключи в списке, а затем используя этот список для доступа словарь. Пример...
Dictionary<string, int> dupcheck = new Dictionary<string, int>();
... некоторый код, который заполняет "dupcheck", затем...
if (dupcheck.Count > 0) {
Console.WriteLine("\ndupcheck (count: {0})\n----", dupcheck.Count);
var keys_sorted = dupcheck.Keys.ToList();
keys_sorted.Sort();
foreach (var k in keys_sorted) {
Console.WriteLine("{0} = {1}", k, dupcheck[k]);
}
}
Не забывайте using System.Linq;
для этого.
Ответ 6
В то время как словарь реализован как хеш-таблица, SortedDictionary реализуется как дерево Red-Black.
Если вы не пользуетесь приложением в своем алгоритме и вам нужно только сортировать данные перед выходом, с использованием SortedDictionary будет иметь негативное влияние на производительность.
Вы можете "сортировать" словарь следующим образом:
Dictionary<string, int> dictionary = new Dictionary<string, int>();
// algorithm
return new SortedDictionary<string, int>(dictionary);