Как вы сортируете словарь по значению?

Я написал простой плагин jQuery, который позволяет использовать пользовательское событие «singleclick», чтобы разделить один клик с двойного щелчка. Это позволяет вам построить интерфейс, в котором один клик делает редактируемый вход, а двойной щелчок расширяет его. Так же, как Windows / OSX файловая система переименовать / открыть интерфейс.

https://github.com/omriyariv/jquery-singleclick

$('#someInput').on('singleclick', function(e) {
    // The event will be fired with a small delay but will not fire upon a double-click.
    makeEditable(e.target);
}

$('#container').on('dblclick', function(e) {
    // Expand the row...
}

749
задан Tiago Martins Peres 16 October 2018 в 16:55
поделиться

8 ответов

Использование:

using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> pair1,
    KeyValuePair<string, string> pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

, Так как Вы нацелены на.NET 2.0 или выше, можно упростить это в синтаксис лямбды - это эквивалентно, но короче. При предназначении для.NET 2.0, можно только использовать этот синтаксис при использовании компилятора от Visual  Studio  2008 (или выше).

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
500
ответ дан Peter Mortensen 16 October 2018 в 16:55
поделиться

Вы никогда не были бы в состоянии отсортировать словарь так или иначе. Им на самом деле не заказывают. Гарантии словаря - то, что ключ и оценивает наборы, повторяемы, и значения могут быть получены индексом или ключом, но нет никакой гарантии никакого конкретного порядка. Следовательно необходимо было бы получить пару значение-имя в список.

24
ответ дан Roger Willcocks 16 October 2018 в 16:55
поделиться

Оглядывание и использование некоторых функций C# 3.0 мы можем сделать это:

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

Это - самый чистый способ, которым я видел, и подобно Ruby способ обработать хеши.

157
ответ дан Alexander 16 October 2018 в 16:55
поделиться

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

, Возможно, это помогает: http://bytes.com/forum/thread563638.html Копия/Вставка от John Timney:

Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("1", "a Item");
s.Add("2", "c Item");
s.Add("3", "b Item");

List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s);
myList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);
59
ответ дан Community 16 October 2018 в 16:55
поделиться

Используйте LINQ:

Dictionary<string, int> myDict = new Dictionary<string, int>();
myDict.Add("one", 1);
myDict.Add("four", 4);
myDict.Add("two", 2);
myDict.Add("three", 3);

var sortedDict = from entry in myDict orderby entry.Value ascending select entry;

Это также допускало бы большую гибкость, в которой можно выбрать лучшие 10, 20 10%, и т.д. Или если Вы используете свой индекс частотности слова для type-ahead, Вы могли бы также включать StartsWith пункт также.

502
ответ дан Peter Mortensen 16 October 2018 в 16:55
поделиться

Самый простой способ получить отсортированный Словарь - использовать встроенный класс SortedDictionary :

//Sorts sections according to the key value stored on "sections" unsorted dictionary, which is passed as a constructor argument
System.Collections.Generic.SortedDictionary<int, string> sortedSections = null;
if (sections != null)
{
    sortedSections = new SortedDictionary<int, string>(sections);
}

sortedSections будет содержать отсортированная версия разделов

5
ответ дан 22 November 2019 в 21:24
поделиться

Сортировка списка SortedDictionary для привязки в элемент управления ListView с помощью VB.NET:

Dim MyDictionary As SortedDictionary(Of String, MyDictionaryEntry)

MyDictionaryListView.ItemsSource = MyDictionary.Values.OrderByDescending(Function(entry) entry.MyValue)

Public Class MyDictionaryEntry ' Need Property for GridViewColumn DisplayMemberBinding
    Public Property MyString As String
    Public Property MyValue As Integer
End Class

XAML:

<ListView Name="MyDictionaryListView">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyString}" Header="MyStringColumnName"></GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyValue}" Header="MyValueColumnName"></GridViewColumn>
         </GridView>
    </ListView.View>
</ListView>
9
ответ дан 22 November 2019 в 21:24
поделиться

Или для развлечения вы можете используйте некоторые возможности расширения LINQ:

var dictionary = new Dictionary<string, int> { { "c", 3 }, { "a", 1 }, { "b", 2 } };
dictionary.OrderBy(x => x.Value)
  .ForEach(x => Console.WriteLine("{0}={1}", x.Key,x.Value));
11
ответ дан 22 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: