2010-12-13 85 views
5

J'ai défini un type comme suit:Tri IEnumerable <type> par trois champs

public class myType 
{ 
    public string firstName { get; set; } 
    public string middleName { get; set; } 
    public string lastName { get; set; } 
} 

J'ai un IEnumerable<myType>.

Je souhaite utiliser l'extension .OrderBy() pour trier ma liste de myType comme suit.

Les objets doivent être en ordre par nom de famille. Lorsque les noms sont les mêmes, ils doivent être classés par prénom. Lorsque les prénoms sont les mêmes, ils doivent être classés par prénom.

Comment faire?

+1

(les membres devront être * accessibles * (habituellement: 'public') pour les trier, et les propriétés sont généralement préférées aux champs) –

Répondre

17
var qry = items.OrderBy(x => x.lastName).ThenBy(x => x.firstName) 
    .ThenBy(x => x.middleName); 

ou dans la syntaxe LINQ:

var qry = from x in items 
      orderby x.lastName, x.firstName, x.middleName 
      select x; 
+0

+1. Rappelez-vous que le lambda peut être n'importe quel code qui retourne une chaîne, donc vous pourriez, par exemple. effectuer une vérification nulle et retourner une valeur par défaut non nulle. Je ne sais pas comment le QuickSort intégré derrière la plupart des trieurs .NET gérera les valeurs nulles. De plus, bien que OrderBy() soit stable, si c'est le cas, il n'utilise pas le trieur intégré qui alimente aussi List.Sort et Array.Sort et est instable. – KeithS

+2

@KeithS: Il n'est pas nécessaire de renvoyer une chaîne. Cela peut être n'importe quoi qui renvoie une valeur, tant que les valeurs peuvent être comparées pour les commander plus tard. Et oui, OrderBy est vraiment * stable *. –

7
myList.OrderBy(t => t.lastName).ThenBy(t => t.firstName).ThenBy(t => t.middleName) 

En outre, chaque OrderBy et ThenBy ont une version Descending, si OrderByDescending et ThenByDescending