首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Comparison<T>理解

System.Comparison<T>理解
EN

Stack Overflow用户
提问于 2010-08-17 10:26:05
回答 2查看 5.1K关注 0票数 8

List<T>.Sort()方法有3个重载。

其中之一如下所示

代码语言:javascript
复制
System.Collections.Generic.List<T>.Sort(System.Comparison<T>)

在看到Comparison<T>时,我认为它应该是一个从Comparison<T>类派生的类。(对参数的通常解释)

但是下面的代码运行得很好,据说是使用了上面的重载。

代码语言:javascript
复制
        public static void Main(string[] args)
        {
            List<Int32> collection = new List<Int32>();

            collection.Add(20);
            collection.Add(270);
            collection.Add(30);
            collection.Add(90);
            collection.Add(40);
            collection.Add(18);
            collection.Add(100);

            collection.Sort(MyComparer.CompareWithCase);

            foreach (Int32 s in collection)
                Console.WriteLine(s);
        }

        public static int CompareWithCase(int i1, int i2)
        {
            return i1.ToString().CompareTo(i2.ToString());
        }

我确实给了一个静态方法一个委托来代替Comparison<T>。它怎麽工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-17 10:32:07

System.Comparison的定义如下:

代码语言:javascript
复制
public delegate int Comparison<in T>(T x, T y);

这意味着它是delegate,而不是一个类。接受委托作为参数的方法实际上接受的是方法,而不是比较类的实例。

这段代码可以用lambda表达式重写如下:

代码语言:javascript
复制
collection.Sort((i1, i2) => i1.ToString().CompareTo(i2.ToString()));

下面的代码片段可能更好地解释了发生的情况:

代码语言:javascript
复制
public static class TestClass {

  public static void Main(string[] args){
      Comparison<Int32> comparisonDelegate = CompareWithCase;
      //We now can use comparisonDelegate as though it is a method;
      int result = comparisonDelegate(1,2);
  }

  public static int CompareWithCase(int i1, int i2)
  {
     return i1.ToString().CompareTo(i2.ToString());
  } 
}
票数 11
EN

Stack Overflow用户

发布于 2010-08-17 10:30:21

System.Comparison是一个代表。

代码语言:javascript
复制
public delegate int Comparison<in T>(
    T x,
    T y
)

您的CompareWithCase方法的签名使其完全可以赋值给Comparison<int>

请注意,如果没有类型推断,您的Sort调用必须编写为:

代码语言:javascript
复制
 collection.Sort(new Comparison<int>(MyComparer.CompareWithCase));

仅供参考,List<T>.Sort的另外两个重载期望IComparer<T>实现

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3498891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档