好的,这很有效。究竟是什么?

时间:2009-11-20 04:54:13

标签: c# list anonymous-methods

我刚从网站上取消了这个片段,事实证明这正是我针对特定问题所需的解决方案。

我不知道它是什么(特别是委托和返回部分),并且消息来源没有解释它。

希望SO可以启发我。

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

6 个答案:

答案 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

希望解释有用。