2010-06-09 1 views
44

Quale sarebbe il modo giusto per ordinare un elenco di stringhe in cui voglio che gli oggetti inizino con un carattere di sottolineatura '_', in fondo all'elenco, altrimenti tutto è in ordine alfabetico.Logica di ordinamento personalizzata in OrderBy con LINQ

In questo momento sto facendo qualcosa di simile,

autoList.OrderBy(a => a.StartsWith("_") ? "ZZZZZZ"+a : a) 

risposta

89

Se volete ordinamento personalizzato, ma don 't vuole fornire un operatore di confronto, si può avere - stile sql:

autoList 
.OrderBy(a => a.StartsWith("_") ? 2 : 1) 
.ThenBy(a => a); 
+4

Mi piace questa soluzione meglio. Mi dimentico sempre di ThenBy. –

+0

Grazie. È perfetto. –

+2

+1 Piace molto questa soluzione. Molto bella. –

2

Utilizzare il sovraccarico di OrderBy che prende un IComparer, il primo argomento Func alimenterà il comparatore e da lì è necessario confrontare le stringhe. In primo affare con il caso di uno o entrambi inizia con _, e poi da lì si avrà probabilmente bisogno di spogliare il _ e basta usare lo standard string.Compare per ordinare loro di là del primo _

+1

Tuttavia, in tutta onestà, anche se tecnicamente il tuo approccio è un hack e possono fallire, è molto più semplice e più facile da capire il vostro intento. –