2011-08-12 13 views
9

¿Es posible realizar un pedido en Linq de acuerdo con un pedido específico? algo así comoespecífico Pedido por Linq a SQL

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

La idea es que el campo País se ordena según el orden específico de la cadena

Respuesta

16

Hay una manera muy directa en su ejemplo:

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)); 

De esta manera, usted está pidiendo por el índice de País se encuentra en la cadena de secuencia. Solo tenga en cuenta que los elementos no encontrados serán -1, que también puede corregir si lo desea.

Si desea hacer algo más complejo, puede crear su propia implementación personalizada de clase IComparer para comparar los elementos utilizando su orden personalizado. Esto puede pasarse a OrderBy.

Tal IComparer se vería así:

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)); 
    } 
} 

y se puede llamar como:

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

De cualquier manera funciona bien, este último es agradable y reutilizable, pero el primero (usando IndexOf directamente) sigue siendo muy conciso también. Tu elección.

+0

¿Puede sugerirme en cualquier lugar que pueda leer sobre esto? – Guillermo

+0

@Guillermo: acabo de editar mi ejemplo, aunque de una manera muy directa usando Array.IndexOf() –

+0

Genial, he sido muy útil – Guillermo

1

así que puede pasar en su propio delegado en función orderBy y la lógica de comparación en ese caso puede ser definido por ti.