System.Comparison <t>理解</t>

时间:2010-08-17 02:26:05

标签: .net

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

其中一个是以下

System.Collections.Generic.List<T>.Sort(System.Comparison<T>)

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

但是下面的工作非常好,据说使用了上面的重载。

        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>。 它是如何工作的?

2 个答案:

答案 0 :(得分:9)

System.Comparison<T>定义如下:

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

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

此代码可以使用lambda表达式重写如下:

collection.Sort((i1, i2) => i1.ToString().CompareTo(i2.ToString()));

以下代码段可能会更好地解释会发生什么:

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

答案 1 :(得分:1)

System.Comparison<T> 代表。

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

CompareWithCase方法的签名使其可以完美地分配给Comparison<int>

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

 collection.Sort(new Comparison<int>(MyComparer.CompareWithCase));

仅供参考,List<T>.Sort期望IComparer<T>实施的其他2次重载