Wie sortieren Sie ein Wörterbuch nach Wert?

  • Ich muss oft ein Wörterbuch sortieren, das aus den Schlüsseln & amp; besteht. Werte nach Wert. Zum Beispiel habe ich einen Hash von Wörtern und entsprechenden Frequenzen, die ich nach Häufigkeit ordnen möchte.

    Es gibt ein SortedList, das für einen einzelnen Wert (z. B. Frequenz) gut ist ), dass ich es wieder dem Wort zuordnen möchte.

    SortedDictionary sortiert nach Schlüssel, nicht nach Wert. Einige greifen auf eine benutzerdefinierte Klasse zurück, aber gibt es einen saubereren Weg?

    13 March 2015
    Ashutosh NigamKalid
16 answers
  • Verwenden Sie 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;
     

    Dies würde auch große Flexibilität bei der Auswahl ermöglichen Top 10, 20 10% usw. Wenn Sie Ihren Worthäufigkeitsindex für type-ahead verwenden, können Sie auch die Klausel StartsWith einfügen.

    01 September 2017
    Peter Mortensen
  • Verwenden Sie:

     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);
        }
    );
     

    Da Sie .NET 2.0 oder höher als Ziel verwenden, können Sie dies tun Vereinfachen Sie dies in Lambda-Syntax - es ist gleichwertig, aber kürzer. Wenn Sie auf .NET 2.0 abzielen, können Sie diese Syntax nur verwenden, wenn Sie den Compiler aus Visual Studio 2008 (oder höher) verwenden.

    var myList = aDictionary.ToList(); myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
    01 September 2017
    Peter Mortensen
  •  var ordered = dict.OrderBy(x => x.Value);
     
    11 November 2010
    sean
  • Wenn Sie sich umsehen und einige C # 3.0-Funktionen verwenden, können Sie Folgendes tun:

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

    Dies ist der sauberste Weg, den ich gesehen habe, und ähnelt dem Ruby-Umgang mit Hashes.

    29 January 2013
    Alexander62071072SP
  • Sie können ein Wörterbuch nach Wert sortieren und in sich selbst speichern (so dass die Werte nacheinander angezeigt werden):

     dict = dict.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
     

    Sicher, es ist möglicherweise nicht korrekt, aber es funktioniert.

    30 April 2015
    Matt Frear
  • Sie können sowieso nie ein Wörterbuch sortieren. Sie sind eigentlich nicht bestellt. Die Garantien für ein Wörterbuch bestehen darin, dass die Schlüssel- und Wertesammlungen iterierbar sind und Werte per Index oder Schlüssel abgerufen werden können. Hier kann jedoch keine bestimmte Reihenfolge garantiert werden. Daher müssten Sie das Name-Wert-Paar in eine Liste aufnehmen.

    20 December 2008
    Roger Willcocks
  • Sie sortieren keine Einträge im Wörterbuch. Die Wörterbuchklasse in .NET ist als Hashtabelle implementiert. Diese Datenstruktur ist nicht nach Definition sortierbar.

    Wenn Sie Ihre Sammlung (nach Schlüssel) durchlaufen müssen, können Sie dies tun Sie müssen SortedDictionary verwenden, das als binärer Suchbaum implementiert ist.

    In Ihrem Fall ist die Quellstruktur jedoch irrelevant, da sie nach einem anderen Feld sortiert wird. Sie müssten es dennoch nach Häufigkeit sortieren und in einer neuen Sammlung nach dem entsprechenden Feld (Häufigkeit) sortieren. In dieser Sammlung sind die Frequenzen Schlüssel und Wörter Werte. Da viele Wörter dieselbe Häufigkeit haben können (und Sie sie als Schlüssel verwenden werden), können Sie weder Dictionary noch SortedDictionary verwenden (sie erfordern eindeutige Schlüssel). Damit bleibt Ihnen eine SortedList.

    Ich verstehe nicht, warum Sie darauf bestehen, einen Link zum ursprünglichen Element in Ihrem Haupt- / ersten Wörterbuch beizubehalten.

    Wenn die Objekte in Ihrer Sammlung eine komplexere Struktur (mehr Felder) hätten und Sie unter Verwendung mehrerer verschiedener Felder als Schlüssel effizient darauf zugreifen / sortieren müssen, würden Sie dies wahrscheinlich tun benötigen eine benutzerdefinierte Datenstruktur, die aus dem Hauptspeicher bestehen würde, der das Einfügen und Entfernen von O (1) (LinkedList) und verschiedene Indexierungsstrukturen unterstützt - Wörterbücher / SortedDictionary / SortedLists. Diese Indizes würden eines der Felder Ihrer komplexen Klasse als Schlüssel und einen Zeiger / Verweis auf den LinkedListNode in der LinkedList als Wert verwenden.

    Sie müssten Einfügungen und koordinieren Entfernungen, um Ihre Indizes mit der Hauptsammlung (LinkedList) und Entfernungen zu synchronisieren, wären ziemlich teuer, denke ich. Dies ist vergleichbar mit der Funktionsweise von Datenbankindizes - sie sind fantastisch für Suchvorgänge, aber sie werden bei Bedarf zur Last viele Insetions und Deletions durchführen.

    Alle oben genannten Punkte sind nur dann gerechtfertigt, wenn Sie einige umfangreiche Nacharbeitsvorgänge durchführen. Wenn Sie sie nur einmal nach Frequenz sortieren müssen

    31 October 2013
    nawfal
  •  Dictionary<string, string> dic= new Dictionary<string, string>();
    var ordered = dic.OrderBy(x => x.Value);
    return ordered.ToDictionary(t => t.Key, t => t.Value);
     
    20 July 2015
    mrfazolka
  • Oder zum Spaß können Sie LINQ-Erweiterungen verwenden:

     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));
     
    30 June 2010
    mythz
  • Werte sortieren

    Hier wird gezeigt, wie die Werte in einem Wörterbuch sortiert werden. Wir sehen ein Konsolenprogramm, das Sie in Visual Studio kompilieren und ausführen können. Es fügt Schlüssel zu einem Wörterbuch hinzu und sortiert sie dann nach ihren Werten. Denken Sie daran, dass Dictionary-Instanzen zunächst nicht in irgendeiner Weise sortiert werden. Wir verwenden das LINQ-Orderby-Schlüsselwort in einer Abfrageanweisung.

    OrderBy-Klausel Programm zur Sortierung des Dictionary [C #]

     using System;
    using System.Collections.Generic;
    using System.Linq;
    
    class Program
    {
        static void Main()
        {
            // Example dictionary.
            var dictionary = new Dictionary<string, int>(5);
            dictionary.Add("cat", 1);
            dictionary.Add("dog", 0);
            dictionary.Add("mouse", 5);
            dictionary.Add("eel", 3);
            dictionary.Add("programmer", 2);
    
            // Order by values.
            // ... Use LINQ to specify sorting by value.
            var items = from pair in dictionary
                    orderby pair.Value ascending
                    select pair;
    
            // Display results.
            foreach (KeyValuePair<string, int> pair in items)
            {
                Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
            }
    
            // Reverse sort.
            // ... Can be looped over in the same way as above.
            items = from pair in dictionary
            orderby pair.Value descending
            select pair;
        }
    }
     

    Ausgabe

     dog: 0
    cat: 1
    programmer: 2
    eel: 3
    mouse: 5
     
    24 October 2012
    CAMOBAPManju