Ordinamento fluente di un elenco < T > su più criteri utilizzando metodi di estensione?

StackOverflow https://stackoverflow.com/questions/802002

  •  03-07-2019
  •  | 
  •  

Domanda

Per ordinare un elenco su più criteri, attualmente sto facendo qualcosa del tipo:

collection.Sort((f1, f2) =>
{
    var comp = f1.FirstCriteria.CompareTo(f2.FirstCriteria);
    return comp != 0 ? comp : f1.SecondCriteria.CompareTo(f2. SecondCriteria);
});

Ma non sarebbe bello poter fare qualcosa del tipo:

collection.MultipleSort(f1.FirstCriteria, f2.FirstCriteria)
          .Then(f1.SecondCriteria, f2.SecondCriteria)

Qualche idea per una buona implementazione di un'interfaccia fluida per l'ordinamento?

È stato utile?

Soluzione

Intendi qualcosa di simile al seguente?

using System.Linq;

collection.OrderBy(t => t.FirstCriteria).ThenBy(t => t.SecondCriteria);

Altri suggerimenti

Il problema qui è che sembra che tu voglia fare un in atto ; nel qual caso, dovresti sapere (con un'API fluente) quando hai finito di aggiungere le condizioni. Ciò contrasta con l'approccio LINQ, perché utilizza l'esecuzione differita.

Per le singole condizioni, puoi usare qualcosa del tipo:

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)));
}

Sarebbe più difficile con più tipi; non puoi usare params perché ogni TValue potrebbe essere diverso. Probabilmente dovrai utilizzare un passaggio di terminazione e un intermediario "builder" classe (essenzialmente scrivendo un DSL), oppure dovresti prima costruire il comparatore separatamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top