2009-11-20 113 views
8

我剛剛從網站上摘錄了這段代碼,事實證明這正是我需要解決特定問題的解決方案。好的,這工作。究竟是什麼?

我不知道它是什麼(特別是代表和返回部分),並且源代碼沒有解釋它。

希望SO能開導我。

myList.Sort( delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
       { 
       return x.Value.CompareTo(y.Value); 
       } 
      ); 
+8

+1想知道你在做什麼,而不是移動到你找到的下一個片段。 – 2009-11-20 05:11:04

+0

不要忘記接受答案。 – 2009-11-20 06:22:59

回答

11

MyList.Sort有一個參數 - 這是負責的項目進行比較的功能,所以列表可以排序accoding它。

下一頁:委託(X,Y)限定了接受型KeyValuePair [字符串,的Int32]的兩個參數的函數本身。

在括號{...}的含量是實際comparisson邏輯:

return x.Value.CompareTo(y.Value); 

其中根據this definition比較2的整數值。

因此,您的清單將根據增值順序中那些整數的值進行排序。


用C#3.5我會改寫這樣的:

mylist.Sort((x,y) => x.Value.CompareTo(y.Value)); 
+0

使用C#3.0,此代碼是否可以縮短? – Chris 2009-11-20 05:06:01

+0

是的。我更新了答案。 – 2009-11-20 05:09:03

+0

所以引擎蓋下,我假設有這樣的事情: 在這個列表中的每個keyvaluepair, 在下一keyvaluepair的「價值」項目在當前keyvaluepair比較「值」項。一個比另一個高一個。 -am我關閉了嗎? – fieldingmellish 2009-11-20 05:11:51

0
myList.Sort //Sort using a your own compare function 
    (
    // declare the compare function, returns a int, and receives two items 
    delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
    { 
     // returns a int indicating whether the items are "equal" - equal being what is implemented it the appropriate compare function. 
     return x.Value.CompareTo(y.Value); 
    } 
); 
+2

我相信它實際上返回一個int,0相等,小於0是x y – Davy8 2009-11-20 05:06:08

+2

它返回INT,NOT BOOLEAN! – 2009-11-20 05:06:44

0

想想這樣。假設您的方法如下所示:

public int MyComparisonMethod(KeyValuePair<string, int> x, KeyValuePair<string,int> y) 
{ 
    return x.Value.CompareTo(y.Value); 
} 

這基本上取兩個值,並將它們進行比較。它返回-1,0或1,這取決於x分別小於,等於或大於y。

現在,在封面下,List.Sort使用了快速排序算法。你需要了解的是,它不斷比較列表中的各種元素。它如何知道a值是否大於,小於或等於b值?它稱這種方法,並基於此,它知道。說得通?

所以這個想法是,你提供了一個機制來比較你的列表中的兩個值,List.Sort使用它來做它需要進行排序的比較。

0

只是一個供參考,

這是在的情況下常用的,你需要排序自定義類的列表。

例如,

class Student 
{ 
    int rollID; 
    string name; 
} 

List<Student> students = new List<Student>(); 

... 

students.Sort(delegate(Student x, Student y) { return x.rollID.CompareTo(y.rollID);}); 
0

這是隱含的,但可能你應該提到你的「myList」的聲明。 讓我爲你寫。

var myList=new List<KeyValuePair<string, int>>(); 

現在,它意味着此列表中的每個項目都是KeyValuePair [string,int]的一個實例。

現在,來到您的問題。

Sort方法的重載之一接受一個「比較」委託,它接受兩個集合項並返回一個整數。

public delegate int Comparison<T>(T x, T y) 

從本質上講,你正在做的是創建一個匿名委託其比較兩個項目(在你的情況下,要排序的「價值」,你甚至可以排序的「鑰匙」)使用的「的CompareTo」方法IComparable(字符串和int實現此接口)。

IComparable.CompareTo返回一個整數(Sort方法用於排列列表中的項),指出lhs小於(-1),大於(1)或等於(0)rhs。

供參考:如果你正在使用C#3.0,你甚至不需要匿名委託。您可以使用lambda表達式代替(它是一個速記定義匿名委託,more?

如:

myList.Sort((x, y) => x.Value.CompareTo(y.Value)); 
//Sort over Value 

myList.Sort((x, y) => x.Key.CompareTo(y.Key)); 
//Sort over key 

希望解釋是有幫助的。