Mik*_*son 17 .net c# constructor anonymous-function
为什么匿名函数作为方法的参数而不是构造函数参数?
如果我创建了一个List<string>
,它有一个带有以下签名的Sort方法:
public void Sort(IComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)
以下工作地点:
List<string> list = new List<string>();
list.Sort( (a,b) => a.CompareTo(b) );
Run Code Online (Sandbox Code Playgroud)
SortedSet有一个具有类似签名的构造函数:
public SortedSet(IComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)
但是在构造函数中使用匿名函数时会失败.以下内容无效:
SortedSet<string> set = new SortedSet<string>( (a, b) => a.CompareTo(b) );
Run Code Online (Sandbox Code Playgroud)
创建排序类可以正常工作:
public class MyComparer : IComparer<string>
{
public int Compare(string a, string b)
{ return a.CompareTo(b); }
}
SortedSet<string> set = new SortedSet<string>( new MyComparer() );
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 28
这是因为构造函数接受IComparer<T>
(接口)而不是Comparison<T>
(委托).Anon-methods/lambdas可以支持委托,但不支持(直接)接口.但是很容易包装 - 例如:
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); }
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用:
SortedSet<string> set = new SortedSet<string>(
new FuncComparer<string>( (a, b) => a.CompareTo(b) ));
Run Code Online (Sandbox Code Playgroud)
Phi*_*ein 22
.NET Framework 4.5版本引入了工厂方法Comparer<T>.Create
:
var set = new SortedSet<string>(
Comparer<string>.Create((a, b) => a.CompareTo(b)));
Run Code Online (Sandbox Code Playgroud)
SortedSet 接受接口但不接受委托的解释很好。(但 Java 接受)。
因此,.Net 人员提供了一个工厂方法来创建此类对象,因此您无需为此定义一个新类。
var set = new SortedSet<string>(
Comparer<string>.Create((a, b) => a.CompareTo(b))
);
Run Code Online (Sandbox Code Playgroud)