2010-12-08 12 views
5

Sé cómo ordenar por una propiedad, luego otra. Me pregunto si hay una forma de ordenar linq por cualquier propiedad (o propiedades múltiples al mismo tiempo).Pedido de Linq Por cualquier propiedad

Por ejemplo, una lista de nombres:

->Adam  Jones 
    ->Dude  Lebowski 
    ->Zander Berry 

sería solucionado:

->Adam  Jones 
    Zander ->Berry 
    ->Dude  Lebowski 
+1

¿En qué se diferencia la clasificación por "propiedades múltiples al mismo tiempo" de una propiedad y luego por otra? – LBushkin

+1

Me parece que el OP desea ordenar por el valor de clasificación más antiguo de dos propiedades. – cdhowie

+1

¿Cómo se clasifica 'Adam Jones' y' Jones Adam'? ¿en qué orden? –

Respuesta

6

Esa es una extraña a querer.

Puede pasar cualquier Func < TSource, TKey > te gusta en OrdenarPor: -

names.OrderBy(x => x.FirstName.CompareTo(x.LastName) < 0 
        ? x.FirstName 
        : x.LastName); 

O si cree que el ternario en línea se ve feo (o si es necesario volver a utilizar el tipo de todo el lugar), usted puede escribir su propia IComparer: -

http://msdn.microsoft.com/en-us/library/bb549422.aspx

class PersonFirstOrLastNameComparer : IComparer<Person> 
{ 
    public int Compare(Person x, Person y) 
    { 
    return GetKey(x).CompareTo(GetKey(y)); 
    } 

    private String GetKey(Person person) 
    { 
    if (person.FirstName.CompareTo(person.LastName) < 0) 
    { 
     return person.FirstName; 
    } 
    else 
    { 
     return person.LastName; 
    } 
    } 
} 

y: -

names.OrderBy(x => x, new PersonFirstOrLastNameComparer()); 

Realmente sin embargo, yo le aconsejaría en contra de ella. Si te encuentras clasificando por la primera de dos propiedades en una clase de modelo, sospecho que es probable que tu clase de modelo no esté a la altura de la tarea.

No puedo decir más sin saber más acerca de su aplicación específica, pero probablemente aconsejaría encapsular esa lógica dentro de la clase de modelo (ya sea proporcionando una propiedad específica, por ejemplo, Person.SortKey o si es una clasificación universal por reemplazando a CompareTo) o creando un modelo de vista. Los fragmentos de código que publiqué generarían una gran sorpresa en una revisión del código. Creo que mantener la lógica con el modelo (o ViewModel) aclararía el propósito.

+0

¡Ah! eso es bastante simple. Estaba pensando que habría un '.OrderBy ((x, y) =>/** /)' similar a una función 'sort' pero esto funciona. –

3

¿Qué hay de:

.OrderBy(obj => (obj.PropA < obj.PropB) ? obj.PropA : obj.PropB) 
Cuestiones relacionadas