C# 我是否需要2个比较器<;T>;用于双向排序?

C# 我是否需要2个比较器<;T>;用于双向排序?,c#,sorting,.net-4.0,C#,Sorting,.net 4.0,如果我创建一个比较器来对一组对象进行排序,是否有一种简单的方法来“反转”它以便我可以按另一个方向排序?或者我是否需要定义第二个比较器,并交换比较方法中的测试?您可以使用相同的比较器,只需在需要反转结果时使用myList.Reverse()方法即可 这不是有效代码,但您可以在使用比较器进行排序后使用反向: 既然你把你的问题贴上了标签.Net4 您可以使用LINQOrderBy和ThenBy,因此您甚至不需要一个比较器 var ordered = theList.OrderBy(x => x

如果我创建一个
比较器
来对一组对象进行排序,是否有一种简单的方法来“反转”它以便我可以按另一个方向排序?或者我是否需要定义第二个
比较器
,并交换比较方法中的测试?

您可以使用相同的
比较器
,只需在需要反转结果时使用
myList.Reverse()
方法即可

这不是有效代码,但您可以在使用
比较器进行排序后使用
反向


既然你把你的问题贴上了标签
.Net4

您可以使用
LINQ
OrderBy
ThenBy
,因此您甚至不需要一个
比较器

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

请尝试使用lamba比较器(或建议使用Linq)。反转列表会带来无意义的性能开销,使用它似乎是简单但代价高昂的解决方案。反转,但我想更好的方法是使用建议的Linq选项(我接受MerikOWA关于使用OrderByDescending的观点)。@DaveBish感谢指针;我来看看。reverseOrder不同于更改比较列的顺序,也许你想使用OrderByDescending?+1很好的开箱思考!(我一点也不喜欢创建
比较器
,但它非常好!@Servy。这就是我要的。谢谢。我决定走这条路,因为需要n个比较器,使用的比较器是基于一组条件的。你的解决方案很好,因为我可以在测试结束时有一个条件;
if(Dorevese)result=new ReverseComparer(result);
这是我花时间重新实现LINQ orderBy的原因。在创建了类似的东西之后,
orderbydecenting(数据,比较器)
的实现只不过是调用
orderbyastensing(数据,新的ReverseComparer(比较器))
。在新的.NET 4.5中,有一种替代方法:
Comparer.Create
它是这样的:
var reverseComp=Comparer.Create((x,y)=>comp.Compare(y,x));
var ordered = theList.OrderBy(x => x.First).ThenBy(x => x.Second);
var reverseOrdered = theList.OrderByDescending(x => x.First)
                            .ThenByDescending(x => x.Second);
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));