10

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

编辑

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

4

2 回答 2

4

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

IComparer<Person> comp = Comparer<Person>.Create(
    (p1, p2) => p1.Age.CompareTo(p2.Age)
    );
于 2012-08-08T16:41:30.973 回答
3

据我所知,从 .NET 4.0 开始,框架内还没有这样的转换器。但是,您可以自己编写一个:

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);
    }
}

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

if (x == null)
{
    return y == null ? 0 : -1;
}

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

return _comparison(x, y);
于 2011-04-25T18:29:53.760 回答