2010-12-08 8 views
5

Je sais comment commander par une propriété, puis une autre propriété. Je me demande s'il y a un moyen de commander linq par n'importe quelle propriété (ou plusieurs propriétés en même temps).Linq OrderBy Toute propriété

Par exemple, une liste de noms:

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

serait réglé:

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

Comment le tri par "propriétés multiples en même temps" est-il différent du tri d'une propriété et d'une autre? – LBushkin

+1

Il me semble que l'OP veut trier par la première valeur de tri de deux propriétés. – cdhowie

+1

Comment trier Adam Jones et Jones Adam? dans quel ordre? –

Répondre

6

C'est une position bizarre de vouloir.

Vous pouvez passer toute Func < TSource, TKey > vous aimez dans OrderBy: -

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

Ou si vous pensez que le ternaire en ligne semble laid (ou si vous avez besoin de réutiliser le genre partout l'endroit), vous pouvez écrire votre propre 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; 
    } 
    } 
} 

et: -

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

Vraiment bien, je vous le déconseille. Si vous vous trouvez trier par le plus tôt de deux propriétés sur une classe de modèle, je soupçonne qu'il est probable que votre classe de modèle n'est pas à la hauteur de la tâche. Je ne peux pas en dire plus sans en savoir plus sur votre application spécifique, mais je conseillerais probablement soit d'encapsuler cette logique dans la classe du modèle (soit en fournissant une propriété spécifique, par exemple Person.SortKey ou si c'est un tri universel par CompareTo) ou créer un modèle de vue. Les extraits de code que j'ai postés seraient un peu à la hausse dans une révision de code. Je pense que garder la logique avec le modèle (ou ViewModel) permettrait de clarifier le but.

+0

Ah! c'est plutôt simple. Je pensais qu'il y aurait un '.OrderBy ((x, y) =>/** /)' similaire à une fonction 'sort' mais cela fait l'affaire. –

3

Qu'en est-:

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