2010-05-23 2 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) 
} 

Здесь List.sort ожидает параметр IComparer<p>. И это работает с лямбда , как показано на линии 2. Но когда я пытаюсь сделать, как в строке 1, я получаю эту ошибку:IComparer с использованием выражения Lambda

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

я исследовал это в течение достаточно долгого времени, но я до сих пор не понимаю, it.Maybe мое понимание IComparer не очень хорошо. Может кто-нибудь дать мне руку?

ответ

19

Когда вы делаете , используется перегрузка для Comparison<T>, а не IComparer. Comparison<T> является делегатом, поэтому вы можете использовать для него выражение лямбда.

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); будет работать.

+0

Где и как сравнивается ? –

+2

@duluca Он определен в пространстве имен 'System' как' public delegate int Comparison (T x, T y) '(минус' in' в версиях до .net 4). Он задокументирован [здесь] (http://msdn.microsoft.com/en-us/library/tfakywbh%28v=vs.100%29.aspx). – sepp2k

+0

'CompareTo()' - сравнение, специфичное для культуры. Что-то вроде 'll.sort ((x, y) => String.CompareOrdinal (x.Name, y.Name))' может подойти вам лучше. –

2

IComparer - это интерфейс, а не делегат.

Вы хотите использовать выражение лямбда на своем .CompareTo(), а не на самом интерфейсе.

1

Используйте следующий простой класс:

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); 
    } 
} 
Смежные вопросы