2010-06-28 18 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)) 
); 
相關問題