2011-08-12 13 views
9

È possibile ordinare su Linq secondo un ordine specifico? qualcosa comeOrdine specifico da Linq a SQL

List<bbHeader> bb = new List<bbHeader>(); 
bb.OrderBy(x => x.Country.CompareTo(new string[]{"AR","CL","PY","UY","AUP"})); 

L'idea è che il campo Paese è ordinata secondo l'ordine specifico della stringa

risposta

16

C'è un modo molto diretto nel tuo esempio:

var sequence = new [] { "AR", "CL", "PY", "UY", "AUP" }; 

List<bbHeader> bb = new List<bbHeadher>(); 

// fill bb 

// takes the item, checks the index of the country in the array 
var result = bb.OrderBy(x => Array.IndexOf(sequence, x.Country)); 

In questo modo, si ordina dall'indice Paese si trova nella stringa sequenza. Tieni presente che gli oggetti non trovati saranno -1, che puoi correggere anche se ti piace.

Se vuoi fare qualcosa di più complesso, puoi creare la tua implementazione personalizzata della classe IComparer per confrontare gli articoli usando il tuo ordine personalizzato. Questo può quindi essere passato in OrderBy.

Tale IComparer sarà simile:

public sealed class SequenceComparer : IComparer<string> 
{ 
    private string[] _sequence { get; set; } 

    public SequenceComparer(string[] sequence) 
    { 
     if (sequence == null) throw new ArgumentNullException("sequence"); 

     _sequence = sequence; 
    } 

    public int Compare(string x, string y) 
    { 
     if (ReferenceEquals(x, y)) return 0; 

     return Array.IndexOf(_sequence, x).CompareTo(Array.IndexOf(_sequence, y)); 
    } 
} 

e può essere chiamato come:

var result = bb.OrderBy(x => x.Country, new SequenceComparer(new [] { "AR", "CL", "PY", "UY", "AUP" })); 

In entrambi i casi funziona bene, il secondo è bello e riutilizzabile, ma la prima (utilizzando direttamente IndexOf) è ancora molto conciso. La tua scelta.

+0

Potete suggerire da qualche parte che posso leggere su questo? – Guillermo

+0

@Guillermo: ho appena modificato il mio esempio, anche se in modo molto diretto usando Array.IndexOf() –

+0

Grande, mi è stato molto utile – Guillermo

1

bene si può passare nel proprio delegato al OrderBy la funzione e la logica di confronto in questo caso può essere definito da voi