匿名函数如何用作方法的参数,而不是构造函数的参数?

如果创建List<string>,则它具有带有以下签名的Sort方法:

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

最佳答案

这是因为the constructor接受IComparer<T>(接口(interface)),而不是Comparison<T>(委托(delegate))。匿名方法/lambdas可以支持委托(delegate),但不能(直接)支持接口(interface)。但是,它非常容易包装-例如:

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

关于c# - 构造函数中的SortedSet <T>和匿名IComparer <T>无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3130922/

10-12 12:45
查看更多