首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Comparison<T>()与三个参数重载进行比较

使用Comparison<T>()与三个参数重载进行比较
EN

Stack Overflow用户
提问于 2014-06-23 16:25:55
回答 2查看 94关注 0票数 2

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

我做了:

代码语言:javascript
复制
public int MyCompare(Point p1, Point p2)
{
    ...
}

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

我在工作,好吧。

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

代码语言:javascript
复制
points_.Sort(1, points_.Count()-1, MyCompare); 

但是,在这种过载的情况下,他想要一个IComparer作为论据。

我怎么才能解决这个问题?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-23 16:37:06

正如.NET 4.5+ @dasblinkenlight所指出的,有一种将Comparison<T>委托转换为IComparer<T>的即席方法。

但是,如果您使用的是较低的版本,则可以使用该类将Comparison<T>委托转换为IComparer<T>

代码语言:javascript
复制
    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);
        }
    }

用法示例:

代码语言:javascript
复制
points_.Sort(1, points_.Count()-1, new DelegateComparer<Point>(MyCompare)); 
票数 1
EN

Stack Overflow用户

发布于 2014-06-23 16:29:42

如果不想实现IComparer,可以使用 static method从委托创建一个 static method,如下所示:

代码语言:javascript
复制
points_.Sort(1, points_.Count()-1, Comparer.Create(MyCompare));

甚至是

代码语言:javascript
复制
points_.Sort(1, points_.Count()-1, Comparer.Create((a, b) => {
    ... // comparison logic goes here
}));
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24370785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档