2010-01-23 18 views
22

Diciamo che ho un elenco di oggetti, e voglio ordinare esso dalle voci DateModified proprietà. Perché non posso usare un delegato come questo? Come devo ordinare questi da DateModified se non come illustrato di seguito:C#: ordinamento con funzione anonima

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

Suppongo che abbia abbreviato la funzione per scopi dimostrativi? Perché si suppone che restituisca una stringa ma non restituisca nulla. –

+0

Tempo per selezionare una risposta errata :) – Skurmedel

risposta

47

perché non utilizzare un'espressione lambda?

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

Definitely. La risposta di Jeff era * corretta *, ma * yuck * .Un lambda è molto più pulito – Aaronaught

+1

Una piccola nota, hai perso un ') ':) – Skurmedel

+0

Skurmedel, grazie, ho modificato la risposta. –

14

Se non si desidera utilizzare lambda o superiore a .NET 2.0, utilizzare questo:

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

Nella mia esperienza, in ambienti come Unity, lambda e persino delegati possono causare arresti anomali o problemi, soprattutto su piattaforme come iOS. In quel caso si vorrebbe rendere la vostra selezionatrice una funzione separata in questo modo:

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

Poi si potrebbe passare alla chiamata specie in questo modo:

items.Sort(SortCartItemFunction); 
+0

1+ ma il limite di voto ha raggiunto :( – Skurmedel

0

bool non è utile in un tale delegato , di solito viene utilizzato lo int perché sono necessari 3 valori per rappresentare i risultati del confronto, minori di, uguali e maggiori di. Le raccolte .NET di solito (se non sempre) assumono -1 significa meno di, 0 significa uguale e 1 significa maggiore di.

Si potrebbe quindi, nel vostro delegato, devono verificare se il valore x è minore, uguale o superiore al valore y. Una cosa interessante da notare qui è che se si capovolgono i risultati, per esempio confrontare y con x invece si ordinerà nella direzione opposta.

Per il modo più semplice per ordinare le date, selezionare JohnC's answer o Sam's.

11

Procedimento Sort prende un delegato chiamato Comparison<T>. Stai cercando di passare in un Func<int, int, bool>, che è a sua volta un delegato. Non vi è alcuna conversione tra il delegato Func<int, int, bool> e il delegato Comparison<T>.

È possibile, tuttavia, utilizzare un lambda expression.

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

infatti, si utilizza questa espressione molto lambda e passarlo al costruttore Func<int, int, bool> *. Tuttavia, non è necessario. Un'espressione lambda può essere convertita in qualsiasi delegato whos firma corrisponde - cioè (a, b) => a.DateModified.CompareTo(b.DateModified) possono essere assegnati a qualcosa digitato Func<int, int, int> o qualcosa digitato Comparison<T>. In questo caso, passiamo a qualcosa che si aspetta un Comparison<T>.

* Con una piccola regolazione. Sort richiede un numero intero come tipo di ritorno. I valori negativi indicano meno di, 0 indica uguale e valori positivi indicano maggiore di.

Problemi correlati