Tri d'une liste de classes

Résolu
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - 14 déc. 2017 à 15:33
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 16 déc. 2017 à 01:05
Bonjour,

Je rencontre un problème pour trier une List<T> dont les membres sont des classes.

Ces classes contiennent elles-même des classes.
L'une de ces classes a entre autres une propriété que je souhaiterais utiliser comme critère de tri.

Après pas mal de recherches sur le net, j'ai vu qu'il fallait inclure dans la classe une surcharge de la méthode CompareTo. Mais je ne suis pas arrivé à faire fonctionner le schmilblick. Les exemples fournis ne concernent que des cas (très) simples.

Je vais essayer de synthétiser pour faire comprendre le problème. Il y a peut-être quelques erreurs puisque ce code n'a évidemment pas pu être testé. Mais le principe reste entier.

public class main
{
	List<niveau1> maliste = new List<niveau1>();
	....
	maliste.Sort();    // Ça, c'est ce que je voudrais faire, en précisant "ascendant" ou "descendant" 
}

public class niveau1
{
	string prop11;
	string prop12;
	List<niveau2> ma_sous_classe = new List<niveau2>();  // classe incorporée à examiner
	string prop13;
	autre_classe mon_autre_classe = new autre_classe();
	...
}

public class niveau2
{
	string prop21;
	int prop22;
	string mon_critere_de_tri; // C'est ce qu'il faut comparer, en ascendant ou descendant
	bool prop23;
	...
}

Il faut bien noter qu'il faut trier le premier niveau de la liste en tenant compte du critère situé dans le second niveau. Il n'y a qu'une seule instance de niveau 2 dans chaque niveau 1.
Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas ? Mais cette structure est bien adaptée à un autre usage, et il va falloir faire avec.

Quelqu'un saurait-il m'indiquer comment procéder ?
Merci.
A voir également:

8 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
14 déc. 2017 à 18:17
Bonjour

1)
List<niveau1> 
maliste = new List<niveau1>();
....
maliste.Sort(); // Ça, c'est ce que je voudrais faire, en précisant "ascendant" ou "descendant


Là tu tries ta liste dans le sens descendant ( du plus petit au plus grand alpha numériquement parlant ( Alain sera avant Marc )
Pour le trier dans l'autre sens il faut préciser en plus
)
List<niveau1> 
maliste = new List<niveau1>();
....
maliste.Sort(); // descendant
maliste.Reverse(); // ascendant ( on inverse le sens )


2) si la classe Niveau2 n'a qu'une seule instance pourquoi dans la classe Niveau1 définir Niveau2 come une List


public class main
{
List<niveau1> maliste = new List<niveau1>();
....
maliste.Sort(); // Ça, c'est ce que je voudrais faire, en précisant "ascendant" ou "descendant"
}

public class niveau1
{
string prop11;
string prop12;
niveau2 ma_sous_classe = new niveau2(); // classe incorporée à examiner
string prop13;
autre_classe mon_autre_classe = new autre_classe();
...
}

public class niveau2
{
string prop21;
int prop22;
string mon_critere_de_tri; // C'est ce qu'il faut comparer, en ascendant ou descendant
bool prop23;
...
}



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
14 déc. 2017 à 20:00
Bonsoir VB.

Pour que Sort fonctionne, la classe doit implémenter IComparable, donc posséder la méthode CompareTo, comme MGD l’a vu.
Cette implémentation est la façon de faire historique. Elle presente cependant le défaut d’imposer une seule façon de trier, par exemple pour des gens, ce sera toujours le nom d’abord, le prenom ensuite et la date de naissance. Et quand tu veux trier par prénom c’est compliqué.
Avec linq et la méthode OrderBy, il n’est plus nécessaire d’implémenter IComparable et on définit la logique de tri quand on en a besoin.
Je tacherai de faire un exemple de chaque dans la soiree
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024
15 déc. 2017 à 14:51
Salut Whis
La méthode avec Linq et OrderBy est très intéressante à plus d'un point
1) plus court à écrire ( plus besoin de IComparable)
2) on peut changer le critère de tri quand on veut
3) plus besoin de .Reverse ( OrderByDescending fait le job )

Linq a encore de très beaux jours devant lui

Merci pour ce petit cours très instructif
Un bonjour à MGD Sofware en passant
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
15 déc. 2017 à 15:00
C'est sûr je n'ai pas implémenter IComparable depuis que j'ai eu le droit de passer à la Framework 3.5 au boulot (on avait un système sou Windows2000, que l'on a remplacé qu'en 2013)
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
Modifié le 14 déc. 2017 à 22:30
Avant de montrer un exemple, j'ai une critique sur le bout de code présenté (même en tant qu'exemple), l'utilisation de champs public est très fortement déconseillé, EDIT suppression de mon erreur à la fin.
0
Rejoignez-nous