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

Aquí List.sort espera un IComparer<p> como parámetro. Además, funciona con la lambda como se muestra en la Línea 2. Pero cuando trato de hacer como en la Línea 1, me sale este error:IComparer utilizando Lambda Expresión

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

Me investigado esto por bastante tiempo, pero que todavía no entienden Es posible que mi comprensión de IComparer no sea del todo buena. ¿Puede alguien echarme una mano?

Respuesta

19

Cuando lo haces usa la sobrecarga para Comparison<T>, no IComparer. Comparison<T> es un delegado, por lo que puede usar una expresión lambda para él.

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); funcionará.

+0

¿Dónde y cómo se define la comparación ? –

+2

@duluca Se define en el espacio de nombres 'System' como' delegado público int Comparación (T x, T y) '(menos las versiones 'in' in anteriores a .net 4). Está documentado [aquí] (http://msdn.microsoft.com/en-us/library/tfakywbh%28v=vs.100%29.aspx). – sepp2k

+0

'CompareTo()' es una comparación cultural específica. Algo como 'll.sort ((x, y) => String.CompareOrdinal (x.Name, y.Name))' puede ser más adecuado. –

2

IComparer es una interfaz, no un delegado.

Querrá utilizar la expresión lambda en su .CompareTo(), no en la interfaz en sí.

1

Usar la siguiente clase simple:

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); 
    } 
} 
Cuestiones relacionadas