Сортировка словаря на месте относительно ключей
У меня есть словарь в C# like
Dictionary<Person, int>
и я хочу отсортировать этот словарь на месте в отношении ключей (поле в классе Person). Как я могу это сделать? Каждая доступная помощь в интернете-Это списки без конкретного примера сортировки словаря на месте. Любая помощь будет высоко ценится!
7 ответов:
вы не можете сортировать
Dictionary<TKey, TValue>- Это неупорядоченный по своей сути. (Или, скорее, порядок, в котором извлекаются записи зависит от реализации. Вы не должны полагаться на то, что он работает одинаково между версиями, так как заказ не является частью его разработанной функциональности.)вы можете использовать
SortedList<TKey, TValue>илиSortedDictionary<TKey, TValue>, оба из которых сортируются по ключу (настраиваемым способом, если вы передаетеIEqualityComparer<T>в конструктор) - могут ли они быть полезны для ты?обратите мало внимания на слово "список" в названии
SortedList- это все еще словарь, в котором он отображает ключи к значениям. Это реализовала используя список внутренне, эффективно-поэтому вместо того, чтобы искать по хэш-коду, он выполняет двоичный поиск.SortedDictionaryаналогично основан на двоичном поиске, но через дерево вместо списка.
попробуйте использовать SortedDictionary
правильный ответ уже указан (просто используйте 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;для этого.
по дизайну словари не сортируются. Если вам нужна эта возможность в словаре, посмотрите на SortedDictionary вместо этого.
посмотри
SortedDictionary, есть даже перегрузка конструктора, поэтому вы можете передать свой собственный IComparable для сравнения.
хотя словарь реализован в виде хэш-таблицы, SortedDictionary реализован в виде красно-черного дерева.
Если вы не используете порядок в своем алгоритме и вам нужно только отсортировать данные перед выводом,использование SortedDictionary окажет негативное влияние на производительность.
вы можете "сортировать" словарь следующим образом:
Dictionary<string, int> dictionary = new Dictionary<string, int>(); // algorithm return new SortedDictionary<string, int>(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<Person, int> People = new Dictionary<Person, int>(); 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, int> 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, int> 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: 3LINQ также имеет OrderByDescending и ThenByDescending для тех, кому это нужно.
Comments