2008-10-23 14 views
17

Estoy tratando de ordenar una lista usando delegados pero obtengo un error de coincidencia de firma. El compilador dice que no puedo convertir desde un 'método anónimo'Listas de clasificación de problemas usando delegados

List<MyType> myList = GetMyList(); 
myList.Sort(delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); }); 

¿Qué me falta?

Aquí hay algunas referencias que encontré y lo hacen de la misma manera.

Developer Fusion Reference

Microsoft Reference

Respuesta

46

Creo que desee:

myList.Sort(delegate (MyType t1, MyType t2) 
    { return (t1.ID.CompareTo(t2.ID)); } 
); 

Para ordenar necesita algo distinto de "verdadero/falso", lo que necesita saber si su igual, mayor o menor que.

+14

En Lambda, que va a ser: ' myList.Sort ((t1, t2) => t1. ID.CompareTo (t2.ID)); ' – Jaider

10

El Ordenar hace falta ser un predicado binario, se necesita un delegado Comparison<T> que devuelve un int no es un bool.

Los valores de retorno son 0 para cuando los artículos son iguales, <0 para cuando el primer elemento es menor que el segundo, y >0 para cuando el primer elemento es mayor que el segundo.

0

Asegúrese de que su propiedad de ID sea el tipo de datos de valor predeterminado, como Int o String. Si el ID es un tipo de referencia de objeto, ese objeto debe implementar IComparer o IComparer.

0

Lo siento en la publicación anterior. El editor no toma los caracteres <y>, y no noté la vista previa justo debajo del editor. Si la propiedad ID es un tipo de objeto, el objeto debe implementar IComparer o IComparer <T>.

2

En el futuro, si se quiere depurar problemas como éste, me defiendo romper la definición delegado de la clase llamada, así:

Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... }; 
myList.Sort(c); 

De esta manera, se puede ver si el problema es en su llamada a método, o en su definición de delegado. Algunas personas prefieren dejarlo de esta manera (con un nombre más descriptivo que "c", obviamente) para hacer que el código sea más legible. Podría tomarlo o dejarlo = -)

0

El camino de obj.Sort (delegate (...)); es una clasificación dinámica en un solo lugar. Si tiene varios lugares haciendo la misma clasificación o necesita una clasificación más flexible, puede considerar crear una clase que implemente IComparer <T>. He aquí un ejemplo:

public class MyTypeComparer : IComparer<MyType> 
{ 
    public MyTypeComparer() // default comparer on ID 
    { ... } 

    public MyTypeComparer(bool desc) // default with order specified 

    public MyTypeComparer(string sort, bool desc) // specified sort and order such as property name, true or false. 
    { ... } 

    public int Compare(MyType a, MyType b) // implement IComparer interface 
    { ... } // this is real sorting codes 
} 

y aquí está el ejemplo de usarlo:

List<MyType> myList = GetList(); 
myList.Sort(new MyTypeComparer()); 
// myList.Sort(new MyTypeComparer(false)); 
// myList.Sort(new MyTypeComparer("FirstName", true)); 
Cuestiones relacionadas