Array.Sort sur un tableau de structure

Signaler
Messages postés
51
Date d'inscription
mardi 4 novembre 2003
Statut
Membre
Dernière intervention
28 janvier 2010
-
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
-
Bonjour à tous et à toutes,

J'essaye d'utiliser la fonction Array.Sort d'une manière un peu poussée, et je ne m'en sors pas.

Considérons une structure :

public struct MyStruct {
int a;
int b;
int c;}

Considérons une classe :

public class MyClass {
MyStruct[] TabStruct;
}

Question :

Que faut-il mettre en oeuvre pour trier le tableau de structure par rapport à la propriété a, puis b, puis c ?

Exemple :

a   1   3   2   3
b   5   5   2   4
c   3   2   6   2

me renverrai

a   1   2   3   3
b   5   2   4   5
c   3   6   2   2

En SQL, cela pourrait donner : SELECT a, b,c FROM TabStruct ORDER BY a, b, c

Merci pour vos réponses éventuelles

1 réponse

Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
8
Salut,

Une solution est de te créer une classe qui implémente System.Collections.IComparer (ou sa version générique) et dans la méthode Compare tu fais tes comparaisons dans l'ordre que tu veux

Exemple:

public class MyClass {
MyStruct[] TabStruct;
//..rempli MyStruct
Array.Sort(TabStruct,new StructComparer());
}

//version générique
 public class StructComparer : System.Collections.Generic.IComparer<MyStruct>
    {
        int System.Collections.Generic.IComparer<MyStruct>.Compare(MyStruct m1, MyStruct m2)
        {
            if (m1.a < m2.a)
                return -1;
            else if (m1.a > m2.a)
                return 1;
            else
            {
                if (m1.b < m2.b)
                    return -1;
                else if (m1.b > m2.b)
                    return 1;
                else
                {
                    if (m1.c < m2.c)
                        return -1;
                    else if (m1.c > m2.c)
                        return 1;
                    return 0;
                }
            }
           
        }
    }

Sinon, si tu utilise .net 3.5, tu dois pouvoir le faire avec Linq plus simplement (pas sur de la syntaxe)

var list = from st in MyStruct
            orderby st.a,st.b,st.c
            select st;