我刚从网站上取消了这个片段,事实证明这正是我针对特定问题所需的解决方案。
我不知道它是什么(特别是委托和返回部分),并且消息来源没有解释它。
希望SO可以启发我。
myList.Sort( delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y)
{
return x.Value.CompareTo(y.Value);
}
);
答案 0 :(得分:11)
MyList.Sort 有一个参数 - 负责比较项目的函数,因此列表可以根据它进行排序。
下一步: 委托(x,y) 定义函数本身,它接受两个类型 KeyValuePair [String,Int32] 即可。
括号{...}中的内容是实际的比较逻辑:
return x.Value.CompareTo(y.Value);
根据this definition比较2个整数值。
因此,您的列表将根据加入顺序中的整数值进行排序。
使用C#3.5我会像这样重写它:
mylist.Sort((x,y) => x.Value.CompareTo(y.Value));
答案 1 :(得分:0)
它是一个在列表上调用的排序函数,传递给它的东西是一个委托,由Sort()调用以实际进行两个元素之间的比较。
关于该功能的MSDN页面 http://msdn.microsoft.com/en-us/library/0e743hdt.aspx
答案 2 :(得分: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);
}
);
答案 3 :(得分: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使用它来进行排序所需的比较。
答案 4 :(得分:0)
只是一个FYI,
这通常用于需要对自定义类列表进行排序的情况。
例如
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);});
答案 5 :(得分:0)
这是隐含的,但可能你应该提到你的“myList”的声明。 让我为你写。
var myList=new List<KeyValuePair<string, int>>();
现在,这意味着该列表中的每个项目都是KeyValuePair的实例[string,int]。
现在,回答你的问题。
Sort方法的一个重载接受一个“Comparison”委托,它接受一个集合的两个项并返回一个整数。
public delegate int Comparison<T>(T x, T y)
基本上,你正在做的是创建一个匿名委托,它使用IComparable的“CompareTo”方法比较两个项目(在你的情况下,你在'Value'上排序你甚至可以在'Key'上排序)(字符串和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
希望解释有用。