在重新发明轮子之前,是否有一些从IComparer<T>
创建Func<T,T,int>
的框架方式?
修改
IIRC(已经有一段时间了)Java支持匿名接口实现。这样的构造是否存在于C#中,或者委托是否被视为完全替代?
答案 0 :(得分:4)
在即将推出的.NET4.5(Visual Studio 2012)中,使用静态工厂方法Comparer<>.Create
可以 。例如
IComparer<Person> comp = Comparer<Person>.Create(
(p1, p2) => p1.Age.CompareTo(p2.Age)
);
答案 1 :(得分: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);