How do you sort a dictionary by value?

前端 未结 19 2369
误落风尘
误落风尘 2020-11-22 03:51

I often have to sort a dictionary, consisting of keys & values, by value. For example, I have a hash of words and respective frequencies, that I want to order by frequen

相关标签:
19条回答
  • 2020-11-22 03:57

    Sort and print:

    var items = from pair in players_Dic
                    orderby pair.Value descending
                    select pair;
    
    // Display results.
    foreach (KeyValuePair<string, int> pair in items)
    {
        Debug.Log(pair.Key + " - " + pair.Value);
    }
    

    Change descending to acending to change sort order

    0 讨论(0)
  • 2020-11-22 04:00
    Dictionary<string, string> dic= new Dictionary<string, string>();
    var ordered = dic.OrderBy(x => x.Value);
    return ordered.ToDictionary(t => t.Key, t => t.Value);
    
    0 讨论(0)
  • 2020-11-22 04:04

    Or for fun you could use some LINQ extension goodness:

    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));
    
    0 讨论(0)
  • 2020-11-22 04:06

    The easiest way to get a sorted Dictionary is to use the built in SortedDictionary class:

    //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 will contain the sorted version of sections

    0 讨论(0)
  • 2020-11-22 04:07

    You'd never be able to sort a dictionary anyway. They are not actually ordered. The guarantees for a dictionary are that the key and value collections are iterable, and values can be retrieved by index or key, but there is no guarantee of any particular order. Hence you would need to get the name value pair into a list.

    0 讨论(0)
  • 2020-11-22 04:07

    You do not sort entries in the Dictionary. Dictionary class in .NET is implemented as a hashtable - this data structure is not sortable by definition.

    If you need to be able to iterate over your collection (by key) - you need to use SortedDictionary, which is implemented as a Binary Search Tree.

    In your case, however the source structure is irrelevant, because it is sorted by a different field. You would still need to sort it by frequency and put it in a new collection sorted by the relevant field (frequency). So in this collection the frequencies are keys and words are values. Since many words can have the same frequency (and you are going to use it as a key) you cannot use neither Dictionary nor SortedDictionary (they require unique keys). This leaves you with a SortedList.

    I don't understand why you insist on maintaining a link to the original item in your main/first dictionary.

    If the objects in your collection had a more complex structure (more fields) and you needed to be able to efficiently access/sort them using several different fields as keys - You would probably need a custom data structure that would consist of the main storage that supports O(1) insertion and removal (LinkedList) and several indexing structures - Dictionaries/SortedDictionaries/SortedLists. These indexes would use one of the fields from your complex class as a key and a pointer/reference to the LinkedListNode in the LinkedList as a value.

    You would need to coordinate insertions and removals to keep your indexes in sync with the main collection (LinkedList) and removals would be pretty expensive I'd think. This is similar to how database indexes work - they are fantastic for lookups but they become a burden when you need to perform many insetions and deletions.

    All of the above is only justified if you are going to do some look-up heavy processing. If you only need to output them once sorted by frequency then you could just produce a list of (anonymous) tuples:

    var dict = new SortedDictionary<string, int>();
    // ToDo: populate dict
    
    var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();
    
    foreach (var entry in output)
    {
        Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
    }
    
    0 讨论(0)
提交回复
热议问题