8

我刚刚从一个网站上提取了这个片段,事实证明它正是我需要解决我的特定问题的解决方案。

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

希望SO可以启发我。

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

6 回答 6

11

MyList.Sort有一个参数 - 负责比较项目的函数,因此可以根据它对列表进行排序。

接下来:delegate(x,y)定义函数本身,它接受两个KeyValuePair[String, Int32]类型的参数。

括号 {...} 中的内容是实际的比较逻辑:

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

根据此定义比较 2 个整数值。

因此,您的列表将根据这些整数的值按升序进行排序。


使用 C# 3.5 我会这样重写它:

mylist.Sort((x,y) => x.Value.CompareTo(y.Value));
于 2009-11-20T05:02:25.653 回答
0

这是隐含的,但您可能应该提到“myList”的声明。让我为你写。

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

现在,这意味着该列表中的每个项目都是 KeyValuePair[string,int] 的一个实例。

现在,来回答你的问题。

Sort 方法的重载之一接受“比较”委托,该委托接受集合的两项并返回一个整数。

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

本质上,您所做的是创建一个匿名委托,它使用 IComparable 的“CompareTo”方法(字符串和 int 实现此界面)。

IComparable.CompareTo 返回一个整数(Sort 方法使用它来排列列表中的项目),说明 lhs 小于 (-1)、大于 (1) 或等于 (0) rhs。

仅供参考:如果您正在使用 C# 3.0,您甚至不需要匿名委托。您可以改用 lambda 表达式(它是定义匿名委托的简写,更多?

例如:

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

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

希望解释是有帮助的。

于 2009-11-20T06:07:19.920 回答
0

它是一个在列表上调用的排序函数,传递给它的东西是一个委托,由 Sort() 调用以实际进行两个元素之间的比较。

MSDN 页面上的功能 http://msdn.microsoft.com/en-us/library/0e743hdt.aspx

于 2009-11-20T04:57:47.600 回答
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);
    }
  );
于 2009-11-20T05:03:02.173 回答
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 使用它来进行排序所需的比较。

于 2009-11-20T05:06:26.987 回答
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);});
于 2009-11-20T05:30:28.623 回答