Fluent Sortierung einer Liste auf mehreren Kriterien Erweiterungsmethoden verwenden?
-
03-07-2019 - |
Frage
Um eine Liste nach verschiedenen Kriterien zu sortieren, ich zur Zeit mache so etwas wie:
collection.Sort((f1, f2) =>
{
var comp = f1.FirstCriteria.CompareTo(f2.FirstCriteria);
return comp != 0 ? comp : f1.SecondCriteria.CompareTo(f2. SecondCriteria);
});
Aber wäre es nicht schön, die Lage sein, etwas zu tun:
collection.MultipleSort(f1.FirstCriteria, f2.FirstCriteria)
.Then(f1.SecondCriteria, f2.SecondCriteria)
Alle Ideen für eine gute Umsetzung einer flüssigen Schnittstelle für die Sortierung?
Lösung
Sie meinen, so etwas wie die folgenden?
using System.Linq;
collection.OrderBy(t => t.FirstCriteria).ThenBy(t => t.SecondCriteria);
Andere Tipps
Das Problem hier ist, dass es klingt wie Sie ein anstelle tun wollen sortieren; In diesem Fall müssen Sie (mit einem fließend API) wissen, wenn Sie Bedingungen Zugabe beendet haben. Dies steht im Gegensatz zu dem LINQ-Ansatz, weil die verzögerte Ausführung verwendet.
Für einzelne Bedingung Sorten, können Sie so etwas wie verwenden:
public static void Sort<TSource, TValue>(this List<TSource> source,
Func<TSource, TValue> selector) {
var comparer = Comparer<TValue>.Default;
source.Sort((x,y)=>comparer.Compare(selector(x),selector(y)));
}
public static void SortDescending<TSource, TValue>(this List<TSource> source,
Func<TSource, TValue> selector) {
var comparer = Comparer<TValue>.Default;
source.Sort((x,y)=>comparer.Compare(selector(y),selector(x)));
}
Es wäre schwieriger, mit mehreren Sorten; Sie können nicht params
weil jeder TValue
verschieden sein können. Sie würden vermutlich einen Terminator Schritt und einen Vermittler „Builder“ Klasse müssen entweder verwenden (im Wesentlichen einen DSL-Schreiben), oder Sie würden die comparer separat zuerst konstruieren müssen.