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
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
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.
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.
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
Ich benutzte
var l = Input.OrderBy(key => key.Key);
und ich habe es zu Dictionary konvertiert