Ich habe eine einfache Datenklasse mit dieser Signatur:
internal interface IMyClass {
string Letter { get; }
int Number { get; }
}
Ich möchte diese Daten basierend auf einem Feld (angegeben als string sortField) und einer Richtung (angegeben als bool isAscending) sortieren können )
Derzeit verwende ich einen Schalter (mit der aufsteigenden Logik in jedem Fall als ob)
IEnumerable lst = new IMyClass[];//provided as paramater
switch (sortField)
{
case "letter":
if( isAscending ) {
lst = lst.OrderBy( s => s.Letter );
} else {
lst = lst.OrderByDescending( s => s.Letter );
}
break;
case "number":
if( isAscending ) {
lst = lst.OrderBy( s => s.Number );
} else {
lst = lst.OrderByDescending( s => s.Number );
}
break;
}
Das ist für zwei Eigenschaften ziemlich hässlich, aber wenn die Sortierlogik unterschiedlich ist, wird es zu einem Problem (wir sehen auch, dass s => s.Number dupliziert wird zweimal im Code)
Frage
Was ist der beste Weg, einen booleschen Wert zu übergeben, um die Sortierrichtung auszuwählen?
Was ich habe Versucht
Ich habe System.Core.dll auseinandergerissen und die Implementierungen der OrderBy Extension-Methode gefunden:
OrderBy:
public static IOrderedEnumerable OrderBy(
this IEnumerable source,
Func keySelector
){
return new OrderedEnumerable(
source,
keySelector,
null,
false
);
}
OrderByDescending:
public static IOrderedEnumerable OrderByDescending(
this IEnumerable source,
Func keySelector
){
return new OrderedEnumerable(
source,
keySelector,
null,
true
);
}
Es scheint, dass der Zweck von zwei benannten Methoden darin besteht, diesen booleschen Wert zu abstrahieren. Ich kann meine eigene Erweiterung nicht einfach erstellen, da OrderedEnumberable intern in System.Core ist und es mir falsch erscheint, eine Ebene zu schreiben, die von bool -> methodName -> bool ausgeht.
Wie spezifiziere ich die OrderBy-Richtung von LINQ als booleschen Wert? ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post