2009-11-20 115 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 

希望解释是有帮助的。