【问题标题】:ok, this worked. what is it exactly?好的,这有效。究竟是什么?
【发布时间】:2009-11-20 04:54:12
【问题描述】:

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

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

希望SO可以启发我。

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

【问题讨论】:

  • +1 表示希望了解自己在做什么,而不是继续寻找下一个 sn-p。
  • 别忘了接受答案。

标签: c# list anonymous-methods


【解决方案1】:

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

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

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

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

根据this definition比较两个整数值。

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


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

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

【讨论】:

  • 所以在幕后,我假设发生了这样的事情:对于此列表中的每个键值对,将当前键值对中的“值”项与下一个键值对中的“值”项进行比较键值对。较大的一个被放置在比另一个高一个插槽的位置。 -我关门了吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这样想。假设您有一个看起来像这样的方法:

    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】:
      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);
          }
        );
      

      【讨论】:

      • 我相信它实际上返回一个int,0等于,小于0是x y
      【解决方案5】:

      仅供参考,

      这通常用于需要对自定义类列表进行排序的情况。

      例如

      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);});
      

      【讨论】:

        【解决方案6】:

        这是隐含的,但您可能应该提到“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 表达式(它是定义匿名委托的简写,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
        

        希望解释对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-28
          • 2012-08-27
          • 2010-11-12
          • 2011-03-18
          相关资源
          最近更新 更多