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

У меня есть словарь на C #, как

Dictionary 

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

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

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

    Не обращайте внимания на слово «список» в имени SortedList – это все еще словарь, в котором он сопоставляет ключи со значениями. Он реализован с использованием списка внутри, эффективно – поэтому вместо поиска хеш-кода он выполняет двоичный поиск. SortedDictionary аналогично основан на бинарных поисках, но через дерево вместо списка.

    Попробуйте использовать SortedDictionary

    Правильный ответ уже указан (просто используйте SortedDictionary).

    Однако, если случайно вам нужно сохранить свою коллекцию в качестве словаря, можно получить доступ к клавишам словаря упорядоченным способом, например, заказывая ключи в списке, а затем используя этот список для доступа к Словарьу. Пример…

     Dictionary dupcheck = new Dictionary(); 

    … некоторый код, который заполняет «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; для этого.

    По дизайну словари не сортируются. Если вам нужна эта возможность в словаре, посмотрите на SortedDictionary.

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

    Хотя словарь реализован как хеш-таблица, SortedDictionary реализуется как дерево Red-Black.

    Если вы не воспользуетесь приложением в своем алгоритме и вам нужно только отсортировать данные перед выходом, использование SortedDictionary окажет негативное влияние на производительность .

    Вы можете «сортировать» словарь следующим образом:

     Dictionary dictionary = new Dictionary(); // algorithm return new SortedDictionary(dictionary); 

    Из-за этого ответы на высокое размещение поиска я думал, что решение LINQ OrderBy стоит показать:

     class Person { public Person(string firstname, string lastname) { FirstName = firstname; LastName = lastname; } public string FirstName { get; set; } public string LastName { get; set; } } static void Main(string[] args) { Dictionary People = new Dictionary(); People.Add(new Person("John", "Doe"), 1); People.Add(new Person("Mary", "Poe"), 2); People.Add(new Person("Richard", "Roe"), 3); People.Add(new Person("Anne", "Roe"), 4); People.Add(new Person("Mark", "Moe"), 5); People.Add(new Person("Larry", "Loe"), 6); People.Add(new Person("Jane", "Doe"), 7); foreach (KeyValuePair person in People.OrderBy(i => i.Key.LastName)) { Debug.WriteLine(person.Key.LastName + ", " + person.Key.FirstName + " - Id: " + person.Value.ToString()); } } 

    Вывод:

     Doe, John - Id: 1 Doe, Jane - Id: 7 Loe, Larry - Id: 6 Moe, Mark - Id: 5 Poe, Mary - Id: 2 Roe, Richard - Id: 3 Roe, Anne - Id: 4 

    В этом примере было бы целесообразно также использовать ThenBy для первых имен:

     foreach (KeyValuePair person in People.OrderBy(i => i.Key.LastName).ThenBy(i => i.Key.FirstName)) 

    Затем вывод:

     Doe, Jane - Id: 7 Doe, John - Id: 1 Loe, Larry - Id: 6 Moe, Mark - Id: 5 Poe, Mary - Id: 2 Roe, Anne - Id: 4 Roe, Richard - Id: 3 

    LINQ также имеет OrderByDescending и ThenByDescending для тех, кто в этом нуждается.

    Давайте будем гением компьютера.