2009-08-10 5 views
0

J'ai une liste d'objets dont j'ai besoin pour trier la liste basée sur la propriété de l'objet1 et j'ai besoin de trier à nouveau la liste résultante avec la propriété de l'objet2 sans perdre le groupage obj a 2 nom de la propriété et l'emplacement je dois avoir une liste définitive des objets qui ont été triées avec la région et les objets de même région doivent être triés par nom ...liste triant dans C#

Répondre

3

(En supposant que vous n'avez pas LINQ à votre disposition, ce qui en fait trivial.)

Si vous regardez dans MiscUtil, vous trouverez deux classes utiles: ProjectionComparer et LinkedComparer (IIRC). Implémente fondamentalement le concept «order by» de LINQ - vous spécifiez comment convertir un élément source en une valeur clé, et le comparateur se commande par ces valeurs clés.

LinkedComparer prend deux comparateurs et retourne un nouveau comparateur, qui utilise le comparateur « primaire » en premier, et le comparateur « secondaire » si les valeurs sont égales par rapport à la principale.

Créez deux comparateurs de projection (un pour chaque propriété), puis un comparateur avec les deux, puis passez à List<T>.Sort. Faites-moi savoir si vous avez besoin d'un exemple de code complet, mais ce serait quelque chose comme (en utilisant C# 3):

var comparer = new LinkedComparer<Foo> 
    (ProjectionComparer<Foo>.Create(x => x.FirstProperty), 
     ProjectionComparer<Foo>.Create(x => x.SecondProperty)); 

(en C# 2, vous pouvez utiliser des méthodes anonymes, ils seraient tout simplement être un peu plus long winded.)

0

Une liste a une méthode de tri qui prend un délégué de comparaison comme argument. Il existe également des surcharges où vous pouvez passer votre propre comparateur. Vous pouvez donc écrire une classe qui implémente IComparer. Ensuite, dans l'implémentation de cette classe, vous écrivez le code où vous comparez les 2 objets sur les propriétés que vous voulez.

Questions connexes