2010-01-23 15 views
22

Digamos que tengo una lista de objetos, y quiero ordenarlos por los elementos de la propiedad DateModified. ¿Por qué no puedo usar un delegado como este? ¿Cómo debería ordenar éstos por DateModified si no como se muestra a continuación:C#: ordenando con la función anónima

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(new Func<CartItem, CartItem, bool>((itemA, itemB) => 
    { 
     return itemA.DateModified < itemB.DateModified; 
    })); 
} 
+2

Supongo que acortó la función con fines de demostración. Porque se supone que devuelve una cadena, pero no devuelve nada. –

+0

Es hora de seleccionar una respuesta mistah :) – Skurmedel

Respuesta

47

¿Por qué no utilizar una expresión lambda?

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 
} 
+0

Definitivamente. La respuesta de Jeff fue * correcta *, pero * asco *. Una lambda es mucho más limpia. – Aaronaught

+1

Una pequeña nota, te perdiste un ') ':) – Skurmedel

+0

Skurmedel, gracias, edité la respuesta. –

14

Si no desea utilizar lambdas o mayor que .NET 2.0, utilice esto:

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(delegate(CartItem itemA, CartItem itemB) 
    { 
     return itemA.DateModified.CompareTo(itemB.DateModified); 
    }); 
} 

En mi experiencia, en entornos como Unity, lambdas e incluso delegados pueden causar bloqueos o problemas, especialmente en plataformas como iOS. En ese caso, usted quiere que su clasificador de una función separada de este modo:

int SortCartItemFunction(CartItem itemA, CartItem itemB) 
{ 
    return itemA.DateModified.CompareTo(itemB.DateModified); 
} 

entonces usted podría pasarlo a su llamada clase como esta:

items.Sort(SortCartItemFunction); 
+0

1+ pero límite de votación alcanzado :( – Skurmedel

0

bool no es útil en un delegado tales , generalmente se usa int porque necesita 3 valores para representar los resultados de la comparación, menor, igual o mayor que. Normalmente, las colecciones .NET (si no siempre) suponen -1 significa menos que, 0 significa igual y 1 significa mayor que.

Luego, en su delegado, debe verificar si el valor x es menor, igual o mayor que el valor y. Una cosa interesante a tener en cuenta aquí es que si volteas los resultados, por ejemplo, compara y con x, ordenarás en la dirección opuesta.

Para la manera más fácil de ordenar las fechas, marque JohnC's answer o Sam's.

11

El método Sort toma un delegado pidió Comparison<T>. Está intentando pasar un Func<int, int, bool>, que a su vez es un delegado. No hay conversión entre el delegado Func<int, int, bool> y el delegado Comparison<T>.

Puede, sin embargo, utilizar un lambda expression.

items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 

De hecho, se utiliza esta expresión muy lambda y lo pasa al constructor Func<int, int, bool> *. Sin embargo, no hay necesidad. Una expresión lambda se puede convertir en cualquier delegado cuya firma coincida, es decir, (a, b) => a.DateModified.CompareTo(b.DateModified) se puede asignar a algo escrito Func<int, int, int> o algo escrito Comparison<T>. En este caso, lo pasamos a algo que espera un Comparison<T>.

* Con un pequeño ajuste. Sort expectes un entero como un tipo de devolución. Los valores negativos indican menos que, 0 indica igual, y los valores positivos indican mayor que.

Cuestiones relacionadas