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



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



Dictionary<Person, int>


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

595   7  

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: 3

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

Comments

    Ничего не найдено.