Ähnlich wie bei List <> OrderBy Alphabetical Order möchten wir nach einem Element und dann nach einem anderen sortieren. wir wollen das funktionale Äquivalent von erreichen
SELECT * from Table ORDER BY x, y
Wir haben eine Klasse, die eine Reihe von Sortierfunktionen enthält, und wir haben keine Probleme beim Sortieren nach einem Element.
Beispielsweise:
public class MyClass {
public int x;
public int y;
}
List<MyClass> MyList;
public void SortList() {
MyList.Sort( MySortingFunction );
}
Und wir haben folgendes in der Liste:
Unsorted Sorted(x) Desired
--------- --------- ---------
ID x y ID x y ID x y
[0] 0 1 [2] 0 2 [0] 0 1
[1] 1 1 [0] 0 1 [2] 0 2
[2] 0 2 [1] 1 1 [1] 1 1
[3] 1 2 [3] 1 2 [3] 1 2
Eine stabile Sortierung wäre vorzuziehen, aber nicht erforderlich. Eine Lösung, die für .Net 2.0 funktioniert, ist willkommen.
Antworten:
Denken Sie daran, dass Sie keine stabile Sortierung benötigen, wenn Sie alle Mitglieder vergleichen. Die angeforderte 2.0-Lösung kann folgendermaßen aussehen:
Beachten Sie, dass diese 2.0-Lösung der beliebten 3.5 Linq-Lösung immer noch vorzuziehen ist. Sie führt eine direkte Sortierung durch und erfüllt nicht die O (n) -Speicheranforderungen des Linq-Ansatzes. Es sei denn, Sie möchten natürlich, dass das ursprüngliche List-Objekt unberührt bleibt.
quelle
Für Versionen von .Net, in denen Sie LINQ verwenden können
OrderBy
undThenBy
(oder (ThenByDescending
falls erforderlich)):Hinweis: Für .Net 2.0 (oder wenn Sie LINQ nicht verwenden können) siehe Hans Passant Antwort auf diese Frage.
quelle
Sie müssen die IComparer- Schnittstelle implementieren . Hier ist ein guter Beitrag mit Beispielcode.
quelle
Der Trick besteht darin, eine stabile Sortierung zu implementieren. Ich habe eine Widget-Klasse erstellt, die Ihre Testdaten enthalten kann:
Ich habe IComparable implementiert, damit es instabil nach List.Sort () sortiert werden kann.
Ich habe jedoch auch die statische Methode Compare implementiert, die als Delegat an eine Suchmethode übergeben werden kann.
Ich habe diese Einfügesortiermethode von C # 411 ausgeliehen :
Sie würden dies in die Klasse Helfer Klasse setzen, die Sie in Ihrer Frage erwähnt haben.
Nun, um es zu benutzen:
Und es gibt aus:
Dies könnte wahrscheinlich mit einigen anonymen Delegierten aufgeräumt werden, aber das überlasse ich Ihnen.
EDIT : Und NoBugz demonstriert die Macht anonymer Methoden ... also betrachten Sie meine mehr oldschool: P.
quelle
Dies kann Ihnen helfen, wie Sie die generische C # -Liste sortieren
quelle
Ich hatte ein Problem, bei dem OrderBy und ThenBy mir nicht das gewünschte Ergebnis lieferten (oder ich wusste einfach nicht, wie ich sie richtig verwenden sollte).
Ich ging mit einer Liste. Sortierlösung so etwas.
quelle