我有一个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
答案 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));