2010-08-17 58 views
6

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

其中之一是以下

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

+1

请不要标记您的问题” .net2.0 “除非它们特定于.NET 2.0。 – 2010-08-17 02:31:40

+0

我不明白为什么约翰桑德斯不会将这个标记为.NET 2.0,因为这个问题不适用于.NET 1.1或更早版本。多长时间一次有人提出一个只适用于.NET版本的问题。通常一个问题适用于一个版本和所有较新的版本。 – 2010-12-27 18:21:55

回答

9

System.Comparison<T>定义如下:

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

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

该代码可以用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

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另2个重载预计IComparer<T>实现