使用Comparison <t>()与三个参数compare </t>进行比较

时间:2014-06-23 16:25:55

标签: c# icomparer

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

我做了:

public int MyCompare(Point p1, Point p2)
{
    ...
}

// In my main
// ...
points_.Sort(MyCompare); 
// ...

我工作,好吧。

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

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

但是有了这个重载,他想把IComparer作为参数。

我该如何解决这个问题?

请注意,Point 不是自定义类,它来自Xna框架。我不想使用: IComparer

实现自定义类

2 个答案:

答案 0 :(得分:8)

如果您不想实施IComparer,可以使用Comparer<T>.Create static method从代理创建一个,如下所示:

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

甚至

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

答案 1 :(得分:1)

正如@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));