2010-05-23 45 views
15
class p { 
    public string Name { get; set; } 
    public int Age { get; set; } 
}; 

static List<p> ll = new List<p> 
{ 
    new p{Name="Jabc",Age=53},new p{Name="Mdef",Age=20}, 
    new p{Name="Exab",Age=45},new p{Name="G123",Age=19} 
}; 
protected static void SortList() 
{ 
    IComparer<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); <==(Line 1) 
    ll.Sort((x, y) => x.Name.CompareTo(y.Name));<==(Line 2) 
} 

Ở đây List.sort mong đợi một tham số IComparer<p>. Và nó hoạt động với lambda như trong dòng 2. Nhưng khi tôi cố gắng làm như trong Line 1, tôi nhận được lỗi này:IComparer sử dụng Biểu thức Lambda

Cannot convert lambda expression to type System.Collections.Generic.IComparer' because it is not a delegate type

tôi điều tra này trong một thời gian khá nhưng tôi vẫn không hiểu it.May sự hiểu biết của tôi về IComparer không phải là khá tốt.Có ai đó cho tôi một bàn tay?

Trả lời

19

Khi bạn làm , hãy sử dụng quá tải cho Comparison<T>, chứ không phải IComparer. Comparison<T> là một đại biểu, vì vậy bạn có thể sử dụng một biểu thức lambda cho nó.

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); sẽ hoạt động.

+0

Nơi/cách so sánh được xác định? –

+2

@duluca Nó được định nghĩa trong không gian tên 'System' là' so sánh int ủy nhiệm công khai (T x, T y) '(trừ' in' trong các phiên bản trước .net 4). Nó được ghi lại [ở đây] (http://msdn.microsoft.com/en-us/library/tfakywbh%28v=vs.100%29.aspx). – sepp2k

+0

'CompareTo()' là một so sánh cụ thể về văn hóa. Một cái gì đó như 'll.sort ((x, y) => String.CompareOrdinal (x.Name, y.Name))' có thể phù hợp với bạn tốt hơn. –

2

IComparer là giao diện chứ không phải là đại biểu.

Bạn sẽ muốn sử dụng biểu thức lambda trên .CompareTo(), không phải trên chính giao diện.

1

Sử dụng lớp đơn giản sau đây:

public static class ComparerUtilities 
{ 
    class _Comparer<T> : Comparer<T> 
    { 
     Comparison<T> _comparison; 

     public _Comparer(Comparison<T> comparison) 
     { 
      _comparison = comparison; 
     } 

     public override int Compare(T x, T y) 
     { 
      return _comparison(x, y); 
     } 
    } 

    public static IComparer<T> FromComparison<T>(Comparison<T> comparison) 
    { 
     return new _Comparer<T>(comparison); 
    } 
} 
Các vấn đề liên quan