2010-10-12 6 views
2

Comment trier deux objets dans une liste en utilisant deux propriétés, l'une ascendante et l'autre descendante. Quand linq est utilisé, il dit que j'ai besoin d'implémenter l'interface IComparer mais je ne sais pas comment comparer deux objets en utilisant deux propriétés à la fois.Comparaison de deux objets par deux propriétés

Dire Class Personne par Nom croissant et Âge décroissant.

Répondre

11

Eh bien, vous devez décider quel est votre comparaison principale. Utilisez uniquement la comparaison secondaire si le premier donne l'égalité. Par exemple:

public int Compare(Person p1, Person p2) 
{ 
    int primary = p1.Name.CompareTo(p2.Name); 
    if (primary != 0) 
    { 
     return primary; 
    } 
    // Note reverse order of comparison to get descending 
    return p2.Age.CompareTo(p1.Age); 
} 

(Ceci peut être écrit de manière plus compacte de diverses manières, mais je l'ai gardé très explicite afin que vous puissiez comprendre les concepts.)

Notez que dans MiscUtil j'ai quelques blocs de construction de sorte que vous pouvez facilement construire des comparateurs en utilisant des expressions lambda, composer comparateurs etc.

5

Si vous voulez créer une nouvelle copie de la liste (si vous avez encore l'ordre d'origine dans votre liste initiale), vous pouvez le faire:

List<Person> unsortedList; 

sortedList = unsortedList.OrderBy(p => p.Name).ThenByDescending(p => p.Age);