Classificação fluente de uma lista em vários critérios usando métodos de extensão?
-
03-07-2019 - |
Pergunta
Para classificar uma lista em vários critérios, atualmente estou fazendo algo como:
collection.Sort((f1, f2) =>
{
var comp = f1.FirstCriteria.CompareTo(f2.FirstCriteria);
return comp != 0 ? comp : f1.SecondCriteria.CompareTo(f2. SecondCriteria);
});
Mas não seria bom poder fazer algo como:
collection.MultipleSort(f1.FirstCriteria, f2.FirstCriteria)
.Then(f1.SecondCriteria, f2.SecondCriteria)
Alguma idéia para uma boa implementação de uma interface fluente para classificar?
Solução
Você quer dizer algo como o seguinte?
using System.Linq;
collection.OrderBy(t => t.FirstCriteria).ThenBy(t => t.SecondCriteria);
Outras dicas
O problema aqui é que parece que você deseja fazer um no lugar ordenar; Nesse caso, você precisaria saber (com uma API fluente) quando terminar de adicionar condições. Isso contrasta com a abordagem LINQ, porque isso usa a execução diferida.
Para espécies de condições únicas, você pode usar algo como:
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)));
}
Seria mais difícil com vários tipos; você não pode usar params
Porque cada um TValue
pode ser diferente. Você provavelmente precisaria usar uma etapa do Terminator e uma classe intermediária "construtora" (escrevendo essencialmente uma DSL), ou precisará construir o comparador separadamente primeiro.