使用comparon()对三个参数进行重载比较

本文关键字:三个 参数 比较 重载 comparon 使用 | 更新日期: 2023-09-27 18:10:08

我有一个List<Points>(),我想用一个自定义比较器函数对它进行排序。

我:

public int MyCompare(Point p1, Point p2)
{
    ...
}
// In my main
// ...
points_.Sort(MyCompare); 
// ...

I works, right.

现在我想对除第一个元素之外的所有元素进行排序,所以我想这样做:

points_.Sort(1, points_.Count()-1, MyCompare); 

但是通过这个重载,他想要一个IComparer作为参数。

我该如何解决这个问题?

注意Point 不是一个自定义类,它来自Xna框架。我不想实现一个自定义类与: IComparer

使用comparon<T>()对三个参数进行重载比较

如果不想实现IComparer,可以使用Comparer<T>.Create静态方法从委托创建一个,如下所示:

points_.Sort(1, points_.Count()-1, Comparer.Create(MyCompare));

或者

points_.Sort(1, points_.Count()-1, Comparer.Create((a, b) => {
    ... // comparison logic goes here
}));

正如@dasblinkenlight在。net 4.5+中指出的那样,有一个特别的方法可以将Comparison<T>委托转换为IComparer<T>

但是如果你坚持使用较低的版本,你可以使用这个类将Comparison<T>委托转换为IComparer<T>:

    public class DelegateComparer<T> : IComparer<T>
    {
        private readonly Comparison<T> compDelegate;
        public DelegateComparer(Comparison<T> compDelegate)
        {
            if (compDelegate == null)
                throw new ArgumentNullException("compDelegate");
            this.compDelegate = compDelegate;
        }
        public int Compare(T x, T y)
        {
            return compDelegate(x, y);
        }
    }

使用例子:

points_.Sort(1, points_.Count()-1, new DelegateComparer<Point>(MyCompare));