Ich habe ein ziemlich komplexes Szenario und muss sicherstellen, dass die Elemente in einer Liste sortiert sind.
Zunächst basieren die Elemente in der Liste auf einer Struktur, die eine Unterstruktur enthält.
Zum Beispiel:
%Vor%Jetzt habe ich eine Liste bestehend aus topLevelItems zum Beispiel:
%Vor%Ich brauche eine Möglichkeit, nach der DeliveryTime ASC zu sortieren. Was zur Komplexität beiträgt, ist, dass das DeliveryTime-Feld eine Zeichenfolge ist. Da diese Strukturen Teil einer wiederverwendbaren API sind, kann ich dieses Feld nicht zu einer DateTime ändern, noch kann ich IComparable in der topLevelItem-Klasse implementieren.
Irgendwelche Ideen wie das gemacht werden kann?
Danke
Es klingt, als müssten Sie eine kanonische Datums-Sortierung erhalten, obwohl Ihr Datum als String dargestellt wird, ja? Nun, Sie können den OrderBy
-Operator von LINQ verwenden, aber Sie müssen den string in ein Datum, um korrekte Ergebnisse zu erzielen:
Aktualisierung:
Ich habe das zur Vollständigkeit hinzugefügt - ein echtes Beispiel dafür, wie ich ParseExact mit Invariant culture verwende:
%Vor%Sie können immer eine separate IComparer-Klasse implementieren, es macht keinen Spaß, aber es funktioniert gut:
%Vor% Beachten Sie, dass die meisten Sort()
-Methoden im .NET-Framework eine IComparer
oder IComparer<T>
akzeptieren, wodurch Sie die Vergleichssemantik für jeden Typ neu definieren können. Normalerweise verwenden Sie einfach Comparer<T>.Default
- oder verwenden Sie eine Überladung, die dies im Wesentlichen für Sie bereitstellt.
Erstellen Sie einen neuen Typ, der IComparer implementiert, und verwenden Sie eine Instanz, um die Objekte zu vergleichen .
%Vor%Sie können dann Sort () wie folgt aufrufen:
%Vor% Wenn Sie eine In-Place-Sortierung durchführen möchten, können Sie die Sort
Überladung, die ein Comparison<T>
Argument und eine anonyme Funktion / Lambda:
Wenn Sie lieber eine neue sortierte Sequenz erstellen als eine direkte Sortierung, dann ist LINQs OrderBy
wahrscheinlich der richtige Weg, wie andere bereits erwähnt haben.
Nachdem ich dieses Problem hatte, habe ich einmal einen LambdaComparer implementiert, der den Vergleich basierend auf einem beliebigen Lambda-Ausdruck durchgeführt hat. Nicht genauer Code, aber etwas in dieser Richtung:
%Vor%Ein großer Vorteil ist, dass Sie einen schönen, wiederverwendbaren Code bekommen.
Um die items
-Liste selbst zu sortieren:
Dieser Ansatz hat den Vorteil:
DateTime
Werten anstelle von Strings, ABER ... DateTime
darstellt (im Grunde werden alle ungültigen Zeichenfolgen auf einer Seite der Liste angezeigt) Tags und Links c#