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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top