使用扩展方法对多个条件的List <t>进行流畅排序?</t>

时间:2009-04-29 11:52:13

标签: c# sorting extension-methods

要按多个条件对列表进行排序,我现在正在执行以下操作:

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

但能做出类似的事情不是很好吗

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

有关良好实现流畅界面排序的任何想法吗?

2 个答案:

答案 0 :(得分:15)

您的意思是以下内容?

using System.Linq;

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

答案 1 :(得分:2)

这里的问题是听起来你想要到位排序;在这种情况下,当您完成添加条件时,您需要知道(使用流畅的API)。这与LINQ方法形成对比,因为它使用延迟执行。

对于单一条件排序,您可以使用以下内容:

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

多种类型会更难;您无法使用params,因为每个TValue可能不同。您可能需要使用终结器步骤和中间“构建器”类(基本上编写DSL),或者您需要首先单独构建比较器。