Tri courant d’une liste < T > sur plusieurs critères en utilisant des méthodes d'extension?

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

  •  03-07-2019
  •  | 
  •  

Question

Pour trier une liste sur plusieurs critères, je suis en train de faire quelque chose comme:

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

Mais ne serait-il pas agréable de pouvoir faire quelque chose comme:

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

Des idées pour une bonne implémentation d’une interface fluide pour le tri?

Était-ce utile?

La solution

Vous voulez dire quelque chose comme ce qui suit?

using System.Linq;

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

Autres conseils

Le problème ici est qu’il semble que vous souhaitiez effectuer un tri à la place ; dans ce cas, vous devez savoir (avec une API fluide) à la fin de l'ajout des conditions. Cela contraste avec l'approche LINQ, car elle utilise l'exécution différée.

Pour les tris de conditions simples, vous pouvez utiliser quelque chose comme:

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

Ce serait plus difficile avec plusieurs tris; vous ne pouvez pas utiliser params car chaque TValue peut être différent. Vous devrez probablement utiliser une étape de terminaison et un intermédiaire "constructeur". classe (essentiellement en écrivant un DSL), ou vous auriez d’abord à construire le comparateur séparément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top