it-swarm.com.de

So sortieren Sie ein Wörterbuch nach Schlüssel

Ich habe ein Wörterbuch Dictionary<string, Point>

der Schlüssel ist c1, c3, c2, t1, t4, t2. Ich möchte sie nach c1, c2, c3, t1, t2, t3 sortieren 

Ich versuche es mit zu sortieren

Input.OrderBy(key => key.Key );

aber es geht nicht 

jede Idee, wie man das löst 

26
AMH

Input.OrderBy sortiert das Wörterbuch nicht, es erstellt eine Abfrage, die die Elemente in einer geordneten Reihenfolge zurückgibt.

Vielleicht gibt OrderedDictionary Ihnen, was Sie wollen.

Oder verwenden Sie das generische SortedDictionary

27
Erno de Weerd

Laden Sie das unsortierte Objekt wie folgt in ein SortedDictionary-Objekt:

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData);

Dabei ist unsortedCustomerData derselbe generische Typ (Dictionary-String, String oder in Ihrem Fall String, Punkt). Das neue Objekt wird automatisch nach Schlüssel sortiert

Gemäß msdn: SortedDictionary (IDictionary): Initialisiert eine neue Instanz der SortedDictionary-Klasse, die Elemente enthält, die aus dem angegebenen IDictionary kopiert wurden, und verwendet die Standardimplementierung von IComparer für den Schlüsseltyp.

9
sandman0615

Nur eine Vermutung, aber es sieht so aus, als würden Sie davon ausgehen, dass die Eingabe sortiert wird. Die OrderBy-Methode gibt tatsächlich eine geordnete Instanz eines IOrderedEnumerable-Objekts zurück, das die gleichen Werte enthält. Wenn Sie den Rückgabewert beibehalten möchten, können Sie Folgendes tun:

IOrderedEnumerable orderedInput
orderedInput = Input.OrderBy(key=>key.Key)

Die meisten Methoden, die die Sammlung ändern würden, folgen demselben Muster. Dies geschieht, damit die ursprüngliche Instanz der Sammlung nicht geändert wird. Dies schützt Sie vor versehentlichem Ändern der Instanz, wenn Sie dies nicht beabsichtigen. Wenn Sie nur die sortierte Instanz verwenden möchten, setzen Sie die Variable wie oben gezeigt auf die Rückgabe der Methode.

5
Beth Whitezel

Da Input.OrderBy eine Abfrage erstellt, die die Elemente in einer geordneten Reihenfolge zurückgibt, weisen Sie sie einfach demselben Wörterbuch zu.

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);

Der folgende Code verwendet zwei weitere list s zum sort a-Wörterbuch.

using System;
using System.Collections.Generic;
using System.Drawing;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Dictionary<string,Point> r=new Dictionary<string,Point>();
            r.Add("c3",new Point(0,1));
            r.Add("c1",new Point(1,2));
            r.Add("t3",new Point(2,3));
            r.Add("c4",new Point(3,4));
            r.Add("c2",new Point(4,5));
            r.Add("t1",new Point(5,6));
            r.Add("t2",new Point(6,7));
            // Create a list of keys
            List<string> zlk=new List<string>(r.Keys);
            // and then sort it.
            zlk.Sort();
            List<Point> zlv=new List<Point>();
            // Readd with the order.
            foreach(var item in zlk) {
                zlv.Add(r[item]);
            }
            r.Clear();
            for(int i=0;i<zlk.Count;i++) {
                r[zlk[i]]=zlv[i];
            }
            // test output
            foreach(var item in r.Keys) {
                Console.WriteLine(item+" "+r[item].X+" "+r[item].Y);
            }
            Console.ReadKey(true);
        }
    }
}

Die Ausgabe des obigen Codes ist unten dargestellt.

c1 1 2
c2 4 5
c3 0 1
c4 3 4
t1 5 6
t2 6 7
t3 2 3
2
Jorney Huang

Ich benutzte 

var l =  Input.OrderBy(key => key.Key);

und ich habe es zu Dictionary konvertiert 

0
AMH