Clasificación fluida de una lista < T > en múltiples criterios utilizando métodos de extensión?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Para ordenar una lista según varios criterios, actualmente estoy haciendo algo como:

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

Pero, ¿no sería bueno poder hacer algo como:

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

¿Alguna idea para una buena implementación de una interfaz fluida para la clasificación?

¿Fue útil?

Solución

¿Quieres decir algo como lo siguiente?

using System.Linq;

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

Otros consejos

El problema aquí es que suena como si quisieras hacer una ordenación en lugar ; en cuyo caso, deberías saber (con una API fluida) cuando hayas terminado de agregar condiciones. Esto contrasta con el enfoque LINQ, porque utiliza la ejecución diferida.

Para las clasificaciones de una sola condición, puedes 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)));
}

Sería más difícil con varios tipos; no puede usar params porque cada TValue puede ser diferente. Probablemente deba utilizar un paso de terminación y un intermediario " constructor " clase (esencialmente escribiendo un DSL), o necesitarías construir el comparador primero por separado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top