Сортировка словаря по отношению к ключам

У меня есть словарь на С#, например

Dictionary<Person, int>

и я хочу сортировать этот словарь на месте по отношению к ключам (поле в классе Person). Как мне это сделать? Каждая доступная помощь в Интернете - это список, не содержащий конкретных примеров сортировки словаря. Любая помощь будет высоко оценена!

Ответ 1

Вы не можете отсортировать Dictionary<TKey, TValue> - он неотъемлемо неупорядочен. (Вернее, порядок, в котором извлекаются записи, специфичен для реализации. Вы не должны полагаться на то, что он работает одинаково между версиями, поскольку упорядочение не является частью его разработанных функций.)

Вы можете использовать SortedList<TKey, TValue> или SortedDictionary<TKey, TValue>, оба из которых сортируются по ключу (конфигурируемым способом, если вы передаете IEqualityComparer<T> в конструктор) - могут ли они быть полезными для вас?

Не обращайте внимания на слово "список" в названии SortedList - это еще словарь, в котором он сопоставляет ключи со значениями. Он реализован с использованием списка внутри, эффективно - поэтому вместо поиска хеш-кода он выполняет двоичный поиск. 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);