2010-06-28 52 views
17

匿名函数如何作为方法的参数,但不是构造函数参数?SortedSet <T>和匿名IComparer <T>在构造函数中不起作用


如果我创建一个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()); 

回答

27

那是因为the constructor接受一个IComparer<T>(接口),而不是一个Comparison<T>(委托)。匿名方法/ 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))); 
+0

感谢您的解释和包装代码。我现在看到,我正在使用比较而不是IComparere 排序。 – 2010-06-28 08:30:29

0

我你的情况List.Sort使用这个签名

public void Sort(Comparison<T> comparison) 

,但不是这个

public void Sort(IComparer<T> comparer) 
18

.NET Framework 4.5 re租赁介绍工厂方法Comparer<T>.Create

var set = new SortedSet<string>(
    Comparer<string>.Create((a, b) => a.CompareTo(b))); 
+0

如果我想让这个集合在键之间区分,但是按值排序会怎样? – shinzou 2017-04-09 19:52:35

0

的解释是伟大的,SortedSet的接受一个接口,但不是委托(但Java一样)。

正因为如此,在净球员提供一个工厂方法来创建这样一个对象,所以你并不需要定义一个新类为。

var set = new SortedSet<string>( 
    Comparer<string>.Create((a, b) => a.CompareTo(b)) 
); 
相关问题