我是否需要2个Comparer <t>进行双向排序?</t>

时间:2012-05-10 17:47:20

标签: c# sorting .net-4.0

如果为了排序一组对象而创建Comparer<T>,是否有一种简单的方法可以“反转”它以便我可以向另一个方向排序?或者我是否需要在比较方法中交换测试来定义第二个Comparer<T>

3 个答案:

答案 0 :(得分:5)

public class ReverseComparer<T> : Comparer<T>
{
    private Comparer<T> inputComparer;
    public ReverseComparer(Comparer<T> inputComparer)
    {
        this.inputComparer = inputComparer;
    }

    public override int Compare(T x, T y)
    {
        return inputComparer.Compare(y, x);
    }
}

这允许您执行以下操作:

list.Sort(new ReverseComparer(someOtherComparer));

答案 1 :(得分:4)

这不是高效的代码,但您可以在使用Reverse排序后使用Comparer<T>

var ordered = theList.Sort(new FooComparer()).Reverse();

由于您标记了问题.Net4 您可以使用LINQ OrderByThenBy,因此您甚至不需要一个Comparer<T> ...

var ordered = theList.OrderBy(x => x.First).ThenBy(x => x.Second);
var reverseOrdered = theList.OrderByDescending(x => x.First)
                            .ThenByDescending(x => x.Second);

答案 2 :(得分:1)

您可以使用相同的Comparer<T>,当您需要反转结果时,您只需使用myList<T>.Reverse()方法即可。