首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >构造函数中的SortedSet<T>和匿名IComparer<T>不起作用

构造函数中的SortedSet<T>和匿名IComparer<T>不起作用
EN

Stack Overflow用户
提问于 2010-06-28 16:17:34
回答 4查看 12K关注 0票数 19

为什么匿名函数在方法上作为参数,而不是在构造函数参数中?

如果我创建一个List<string>,它有一个带有以下签名的排序方法:

代码语言:javascript
复制
public void Sort(IComparer<T> comparer)

在以下情况下工作:

代码语言:javascript
复制
List<string> list = new List<string>();
list.Sort( (a,b) => a.CompareTo(b) );

SortedSet有一个具有类似签名的构造函数:

代码语言:javascript
复制
public SortedSet(IComparer<T> comparer)

但当在构造函数中使用匿名函数时,此操作将失败。以下内容无效:

代码语言:javascript
复制
SortedSet<string> set = new SortedSet<string>( (a, b) => a.CompareTo(b) );

创建一个排序类的效果和预期一样好:

代码语言:javascript
复制
public class MyComparer : IComparer<string>
{
    public int Compare(string a, string b)
    { return a.CompareTo(b); }
}

SortedSet<string> set = new SortedSet<string>( new MyComparer() );
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-28 16:23:51

这是因为the constructor接受IComparer<T> (接口),而不是Comparison<T> (委托)。Anon-method/lambda可以支持委托,但不能(直接)支持接口。不过,它很容易包装--例如:

代码语言:javascript
复制
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); }
}

现在您可以使用:

代码语言:javascript
复制
SortedSet<string> set = new SortedSet<string>(
      new FuncComparer<string>( (a, b) => a.CompareTo(b) ));
票数 32
EN

Stack Overflow用户

发布于 2014-04-22 04:31:27

.NET Framework4.5版本引入了工厂方法Comparer<T>.Create

代码语言:javascript
复制
var set = new SortedSet<string>(
    Comparer<string>.Create((a, b) => a.CompareTo(b)));
票数 32
EN

Stack Overflow用户

发布于 2017-08-10 03:29:11

SortedSet接受接口而不接受委托的解释很好(但Java接受)。

正因为如此,.Net人员提供了一个工厂方法来创建这样的对象,所以您不需要为此定义新的类。

代码语言:javascript
复制
var set = new SortedSet<string>( 
    Comparer<string>.Create((a, b) => a.CompareTo(b))
);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3130922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档