Classificação fluente de uma lista em vários critérios usando métodos de extensão?

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

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top