2010-08-17 21 views
6

List<T>.Sort() phương pháp có 3 quá tải.System.Comparison <T> hiểu

Một trong số đó là những điều sau

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

Nhìn thấy Comparison<T>, tôi nghĩ rằng nó phải là một lớp mà có nguồn gốc từ Comparison<T> lớp. (Một cách giải thích thông thường về các thông số)

Nhưng những điều sau đây hoạt động thực sự tốt và được cho là sử dụng quá tải trên.

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

Tôi đã cấp cho đại biểu một phương pháp tĩnh thay cho Comparison<T>. Làm thế nào nó hoạt động?

+1

Xin đừng thẻ câu hỏi của bạn" .net2.0 "trừ khi chúng cụ thể đối với .NET 2.0. –

+0

Tôi không hiểu tại sao John Saunders sẽ không muốn điều này được gắn thẻ .NET 2.0, vì câu hỏi này không áp dụng cho .NET 1.1 hoặc cũ hơn. Và bao lâu thì ai đó có câu hỏi chỉ áp dụng cho 1 phiên bản .NET. Thông thường, một câu hỏi áp dụng cho phiên bản và tất cả các phiên bản mới hơn. –

Trả lời

9

System.Comparison<T> được định nghĩa như sau:

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

Điều đó có nghĩa rằng đó là delegate , không phải một lớp. Một phương thức chấp nhận một delegate như một tham số thực sự chấp nhận một phương thức, không phải là một cá thể của một lớp so sánh.

Mã này có thể được viết lại như sau với một biểu thức lambda:

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

Đoạn sau đây có thể giải thích rõ hơn những gì sẽ xảy ra:

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> một đại biểu.

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

Chữ ký của phương thức CompareWithCase làm cho nó được gán hoàn toàn cho Comparison<int>.

Lưu ý rằng nếu không có kiểu suy luận, gọi Sort bạn sẽ phải được viết như sau:

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

FYI, 2 quá tải khác của List<T>.Sort mong đợi IComparer<T> triển khai