为什么匿名函数在方法上作为参数,而不是在构造函数参数中?
如果我创建一个List<string>
,它有一个带有以下签名的排序方法:
public void Sort(IComparer<T> comparer)
在以下情况下工作:
List<string> list = new List<string>();
list.Sort( (a,b) => a.CompareTo(b) );
SortedSet有一个具有类似签名的构造函数:
public SortedSet(IComparer<T> comparer)
但当在构造函数中使用匿名函数时,此操作将失败。以下内容无效:
SortedSet<string> set = new SortedSet<string>( (a, b) => a.CompareTo(b) );
创建一个排序类的效果和预期一样好:
public class MyComparer : IComparer<string>
{
public int Compare(string a, string b)
{ return a.CompareTo(b); }
}
SortedSet<string> set = new SortedSet<string>( new MyComparer() );
发布于 2010-06-28 16:23:51
这是因为the constructor接受IComparer<T>
(接口),而不是Comparison<T>
(委托)。Anon-method/lambda可以支持委托,但不能(直接)支持接口。不过,它很容易包装--例如:
class FuncComparer<T> : IComparer<T>
{
private readonly Comparison<T> comparison;
public FuncComparer(Comparison<T> comparison) {
this.comparison = comparison;
}
public int Compare(T x, T y) {
return comparison(x, y); }
}
现在您可以使用:
SortedSet<string> set = new SortedSet<string>(
new FuncComparer<string>( (a, b) => a.CompareTo(b) ));
发布于 2014-04-22 04:31:27
.NET Framework4.5版本引入了工厂方法Comparer<T>.Create
var set = new SortedSet<string>(
Comparer<string>.Create((a, b) => a.CompareTo(b)));
发布于 2017-08-10 03:29:11
SortedSet接受接口而不接受委托的解释很好(但Java接受)。
正因为如此,.Net人员提供了一个工厂方法来创建这样的对象,所以您不需要为此定义新的类。
var set = new SortedSet<string>(
Comparer<string>.Create((a, b) => a.CompareTo(b))
);
https://stackoverflow.com/questions/3130922
复制相似问题