2012-01-09 96 views
1

我在一個叫ListSort我如何將方法傳遞給List.Sort()?

List<Stuff> list = new List<Stuff>(); 
list.Sort(StuffSortByName); 

StuffSortByName聲明:

private static int StuffSortByName(Stuff x, Stuff y) 
{ 
    ... 
} 

最讓我驚訝的是,我的代碼編譯作品。這是令人驚訝的是沒有Sort重載採用的方法:

所以我很幸運,因爲我不希望有創建一個完整的對象,實現IComparer,只是爲了排序的東西。但是對於我來說,我在編譯時並不明白。


現在我想複製那個魔法。我想排序一個ListView。但是你不排序listivew,你給一個列表視圖的IComparer通過它的ListViewItemSorter屬性:

listView1.ListViewItemSorter = [IComparer] 

並再次,我不想寫一個整體對象,我只是想傳遞一個本地方法(最好是一種非靜態的):

listView1.ListViewItemSorter = SortListView; 


private static int SortListView(Object x, Object y) 
{ 
    .... 
} 

現在當然,這並不編譯,因爲它沒有任何意義。但是之前的語法不應該編譯 - 但它確實。

所以它給了我希望,我可以在這裏有相同的混淆語法。

我是如何在第一種情況下允許通過一種方法作爲排序比較器的,但是在第二種情況下卻不行?

+1

請注意,第一個匹配'Comparison ',匹配一個函數,該函數需要兩個T並返回一個int。將它傳遞給委託,'Func '等。第二個版本有不同的期望,即'IComparer'。 – 2012-01-09 22:18:38

回答

4

要回答您的第一個問題,可以傳遞方法名稱的原因是因爲Comparison<T>是委託類型,這意味着它是表示方法簽名的類型。詳細信息請參見MSDN

在您的情況,您應該創建一個IComparer對象或有你Stuff對象實施IComparableIComparable<T>(如果可能)。

+0

我完全錯過了它是一個代表。我讀過它,因爲我可以傳遞一個'IComparer',或者使用實現'IComparer'的通用類'Comparison '。但'比較'不是一個通用類... – 2012-01-10 12:22:51

0

我想你只是用this overload。其使用Comparison

從鏈接:

如果提供比較,列表(中T)的元件使用由委託

EDIT

所表示的方法來分類

ListView怎麼樣,你也注意到了,它實現了IComparer不是Comparison,所以你不能只傳遞一個委託給它。