Дополнительно
Как отсортировать словарь по значению?
Мне часто приходится сортировать словарь, состоящий из ключей и значений, по значению. Например, у меня есть хэш слов и соответствующих частот, которые я хочу упорядочить по частоте.
Существует SortedList
, который подходит для одного значения (скажем, частоты), которое я хочу сопоставить со словом.
SortedDictionary упорядочивает по ключу, а не по значению. Некоторые прибегают к custom class, но есть ли более чистый способ?
768
18
Используйте:
Поскольку вы используете .NET 2.0 или выше, вы можете упростить этот синтаксис до лямбда-синтаксиса - он эквивалентен, но короче. Если вы используете .NET 2.0, вы можете использовать этот синтаксис, только если вы используете компилятор из Visual Studio 2008 (или выше).
Используйте LINQ:
Это также допускало бы большую гибкость, в которой Вы можете выбрать лучшие 10, 20 10%, и т.д. Или если Вы используете свой индекс частотности слова для 'типа вперед', Вы могли бы также включать пункт 'StartsWith' также.
Оглядевшись вокруг и используя некоторые возможности C# 3.0, мы можем это сделать:
Это самый чистый способ, который я видел, и он похож на способ Ruby для работы с хэшами.
Вы можете сортировать Словарь стоимостью и спасти ее назад к себе (так, чтобы, когда Вы foreach по ней ценности выходите в заказе):
Несомненно, это может не быть правильно, но это работает.
На высоком уровне у вас нет другого выбора, кроме как пройтись по всему Словарю и посмотреть на каждое значение.
Возможно, это поможет: http://bytes.com/forum/thread563638.html Копирую/вставляю из Джона Тимни:
You' d никогда не быть в состоянии сортировать словарь так или иначе. Им на самом деле не заказывают. Гарантии словаря - то, что ключ и оценивает коллекции, повторяемы, и ценности могут быть восстановлены индексом или ключом, но нет никакой гарантии никакого конкретного заказа. Следовательно Вы должны были бы получить пару стоимости имени в список.
Вы не сортируете записи в Словаре. Класс словаря в.NET осуществлен как hashtable - эта структура данных не поддающаяся сортировке по определению.
Если Вам необходимо повторить по своей коллекции (ключом) - Вы должны использовать SortedDictionary, который осуществлен как Дерево Двоичного поиска.
В Вашем случае однако исходная структура не важна, потому что это сортировано различной областью. Вы должны были бы все еще сортировать его частотой и поместить его в новую коллекцию, сортированную соответствующей областью (частота). Таким образом в этой коллекции частоты - ключи, и слова - ценности. Так как у многих слов может быть та же частота (и Вы собираетесь использовать ее в качестве ключа), Вы не можете использовать ни Словарь, ни SortedDictionary (они требуют уникальных ключей). Это оставляет Вас с SortedList.
Я don' t понимают, почему Вы настаиваете на том, чтобы поддерживать связь с оригинальным пунктом в Вашем главном/первом словаре.
Если бы у объектов в Вашей коллекции была более сложная структура (больше областей), и Вы должны были быть в состоянии эффективно получить доступ/сортировать к ним использующий несколько различных областей в качестве ключей то - Вам, вероятно, была бы нужна таможенная структура данных, которая состояла бы из основного запоминающего устройства, которое поддерживает O (1) вставка и удаление (LinkedList) и несколько структур индексации - Dictionaries/SortedDictionaries/SortedLists. Эти индексы использовали бы одну из областей от Вашего сложного класса как ключ и указатель/ссылка на LinkedListNode< YourClass> в LinkedList как стоимость.
Вы должны были бы скоординировать вставки и удаления, чтобы держать Ваши индексы в синхронизации с главной коллекцией (LinkedList), и удаления будут довольно дорогим I' d думают. Это подобно тому, как индексы базы данных работают - они фантастические для поисков, но они становятся бременем, когда Вы должны выполнить много insetions и удаления.
Все вышеупомянутое только оправдано, если Вы собираетесь сделать некоторый поиск тяжелая обработка. Если Вы только должны произвести их когда-то сортированный частотой тогда, Вы могли бы просто создать список (анонимных) кортежей:
Ценности вида
Это шоу, как сортировать ценности в Словаре. Мы видим программу пульта, которую Вы можете собрать в Визуальной Студии и пробеге. Это добавляет ключи к Словарю и затем сортирует их их ценностями. Помните, что случаи Словаря первоначально не сортированы ни в каком случае. Мы используем LINQ orderby ключевое слово в заявлении вопроса.
Пункт OrderBy Программа тот Словарь видов [C#]
Продукция
Или для забавы Вы могли использовать некоторое дополнительное совершенство LINQ:
Сортировка 'SortedDictionary' перечисляет, чтобы связать в контроль 'ListView', используя VB.NET:
XAML:
Самый легкий способ получить сортированный Словарь состоит в том, чтобы использовать построенный в классе 'SortedDictionary':
'sortedSections' будет содержать сортированную версию 'разделов'
Другие ответы хороши, если у всего, что Вы хотите, должен быть " temporary" список сортирован Стоимостью. Однако, если Вы хотите сортировать словарь 'Ключом', что automatically synchronizes с другим словарем, который сортирован 'Стоимостью', Вы могли использовать ['Bijection< K1, K2>'; класс] (http://ecsharp.net/doc/code/classLoyc_1_1Collections_1_1Bijection.html).
'Bijection< K1, K2>'; позволяет Вам инициализировать коллекцию с двумя существующими словарями, поэтому если Вы хотите, чтобы один из них был не сортирован, и Вы хотите, чтобы другой был сортирован, Вы могли создать свое взаимно однозначное соответствие с кодексом как
Вы можете использовать 'dict' как любой нормальный словарь (это осуществляет 'IDictionary< K, V>';), и затем звонят 'dict. Инверсия', чтобы получить " inverse" словарь, который сортирован 'Стоимостью'.
'Bijection< K1, K2>'; часть [Loyc. Collections.dll] (http://core.loyc.net/), но если Вы хотите, Вы могли бы просто скопировать [исходный код] (https://github.com/qwertie/Loyc/blob/master/Core/Loyc. Collections/Other/Bijection.cs) в Ваш собственный проект.
Отметьте : В случае, если есть несколько ключей с той же стоимостью, Вы can' t используют 'Взаимно однозначное соответствие', но Вы могли вручную синхронизировать между обычным 'Dictionary< Ключ, Value>'; и ['BMultiMap< Стоимость, Key>';] (http://loyc.net/doc/code/classLoyc_1_1Collections_1_1BMultiMap_3_01K_00_01V_01_4.html).
Предположим, что у нас есть словарь как
На самом деле в C#, у вмятины Словарей есть вид () методы, поскольку Вы больше интересуетесь видом ценностями, Вы наклоняетесь, получают ценности, пока Вы не обеспечиваете их ключевой, короче говоря, Вы должны повторить через них, использование LINQ' s Заказ,
Вы можете сделать одну уловку,
или
также зависят от того, какие ценности Вы храните,
действительно ли это единственное (как последовательность, интервал) или несколько (как Список, Множество, пользователь определил класс),
если единственный Вы можете составить список его, тогда применяют вид.
если пользователь определил класс, тогда тот класс должен осуществить IComparable,
'ClassName: IComparable< ClassName>'; и отвергните 'compareTo (ClassName c)' поскольку они больше быстрее, чем LINQ и более объектно-ориентированные.
Учитывая Вас имеют словарь, Вы можете сортировать их непосредственно на использовании ценностей ниже одного лайнера:
Вы можете сортировать Словарь стоимостью и получить результат в словаре, используя кодекс ниже: