使用扩展方法对List<T>进行流畅地多条件排序?

3
为了在多个条件下对列表进行排序,我目前正在执行以下操作:
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个回答

15
你的意思是像下面这样吗?
using System.Linq;

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

现在为什么谷歌没有找到这个! :-) 在提问之前我应该多读些书! - Chris Haines
那么唯一的问题就是如何进行降序排列? - Chris Haines
4
@Hainsey,OrderByDescending和ThenByDescending呢? - LukeH
@Hainsey,我不会太担心错过它。对我来说,Linq扩展并不总是最易发现的东西。但好处是,一旦你发现了它,就不会忘记它 :> - billb

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

如果有多个排序,那就更难了;因为每个 TValue 可能是不同的,所以你不能使用 params。你可能需要使用终止步骤和一个中间的“构建器”类(本质上编写一种 DSL),或者你需要先单独构造比较器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接