首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quick IComparer?

Quick IComparer?
EN

Stack Overflow用户
提问于 2011-04-26 02:23:17
回答 2查看 446关注 0票数 10

在我重新发明轮子之前,有没有一些框架方法可以从Func<T,T,int>创建IComparer<T>

编辑

IIRC (已经有一段时间了) Java支持匿名接口实现。这样的构造在C#中存在吗,或者委托被认为是一种完全的替代方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-09 00:41:31

在即将到来的.NET4.5 (Visual Studio2012)中,这个可以通过静态工厂方法 Comparer<>.Create实现。例如

代码语言:javascript
复制
IComparer<Person> comp = Comparer<Person>.Create(
    (p1, p2) => p1.Age.CompareTo(p2.Age)
    );
票数 4
EN

Stack Overflow用户

发布于 2011-04-26 02:29:54

据我所知,框架中没有像.NET 4.0那样的转换器。不过,你也可以自己写一个:

代码语言:javascript
复制
public class ComparisonComparer<T> : Comparer<T>
{
    private readonly Func<T, T, int> _comparison;

    public MyComparer(Func<T, T, int> comparison)
    {
        if (comparison == null)
            throw new ArgumentNullException("comparison");

        _comparison = comparison;
    }

    public override int Compare(T x, T y)
    {
        return _comparison(x, y);
    }
}

编辑:这当然是假设委托能够以一种一致的方式处理空参数。如果没有,你可以在比较器中处理它们-例如,通过将主体更改为:

代码语言:javascript
复制
if (x == null)
{
    return y == null ? 0 : -1;
}

if (y == null)
{
    return 1;
}

return _comparison(x, y);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5781627

复制
相关文章

相似问题

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