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.
Potete suggerire da qualche parte che posso leggere su questo? – Guillermo
@Guillermo: ho appena modificato il mio esempio, anche se in modo molto diretto usando Array.IndexOf() –
Grande, mi è stato molto utile – Guillermo