Trier une liste

Signaler
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
Bonjour, j'ai une liste que est charger de manière "aléatoire", je voudrait trier cette liste alphabétiquement,je n'y arrive pas avec sort... y a t il une méthode?

 List<string> listeatelecharger = new List<string>();
 listeatelecharger.Add(saved.Value);
listeatelecharger.Sort;
ou 
listeatelecharger.Sort=true;


R A P A K O O T I

10 réponses

Bonjour Rapakooti



Regarde ici

Espérant que sa t'aide
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

Merci de votre réponse , j avais vu ce tuto mais je vois pas comment l adapté à mon cas je veux juste faire un "sort" sur ma liste

R A P A K O O T I
Messages postés
14854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 octobre 2020
444
Bonjour, string est déjà Icomparer, donc sort marche tout seul:

            List<string> toto = new List<string>();
            toto.Add("bb");
            toto.Add("ab");
            toto.Add("ba");
            toto.Add("aa");

            toto.Sort();



Whismeril
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

Alors deja merci c'etais si evident lol
par contre cela ne mache pas quand je lis ma liste elle reste tel quel.
Voici mon code

 
var savedDoc = XDocument.Load(xmlListFilePath);
           foreach (var saved in savedDoc.Root.Elements("FilePath"))
              listeatelecharger.Add(saved.Value);
           max = dataGridView1.Rows.Count;


           listeatelecharger.Sort();
           foreach (string film in listeatelecharger)
            {
                MessageBox.Show(film);
                if (!File.Exists(Path.GetDirectoryName(film) + "\" + Path.GetFileNameWithoutExtension(film) + ".nfo"))
                {
                   //Generation du thread pour generer le fichier html pour un FIlm sans nfo                 
                    Thread t = new Thread(new ParameterizedThreadStart(creationsansnfo));
                    t.Start(film + "*" + emplacementbibli);
                }
                else
                {
                    Thread t = new Thread(new ParameterizedThreadStart(creationnfo));
                    t.Start(film + "*" + emplacementbibli);

                }


            }


Voici mon

R A P A K O O T I
Messages postés
14854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 octobre 2020
444
ça vient peut être du foreach, il m'est arrivé qu'il me lise une list à l'envers....
Peut être dans ta requette linq, pour extraire le xml, il y a moyen de mettre un order by quelque part.

Je regarde ça dans la soirée.


Whismeril
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

Merci attend un peu je crois avoir trouvé mon erreur , comme d'hab tu a raison je pense , je reviens vers toi dans la soiréé

R A P A K O O T I
Messages postés
14854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 octobre 2020
444
Je viens de retester, le foreach marche bien avec une List<string>, c'était avec un objet perso que ça avait bogué.

Par contre, il s'agit d'une de chemins et dans l'ordre alphabétique
"c:\temp\Zigomar.avi" est avant "d:\temp\Amityville.avi"

Si tu veux trier sur le nom du film, tu as peut-être intérêt a créer un objet, dans lequel tu isolerais le nom du film dans un variable.
Et là il te faudrait implémenter Icomparable.


pour exemple je veux trier des personne par le prénom:

    class Personne
    {
        public string Nom { get; set; }

        public string Prenom { get; set; }
    }


J'écris que Personne implémente Icomparable

class Personne:IComparable

Là je fais click droit sur IComparable et "Implementer l'interface" "Implementer l'interface"

Ça va écrire cette méthode
        public int CompareTo(Personne other)
        {
            throw new NotImplementedException();
        }



Dans cette méthode je décris comment comparer l'instance en cours à l'instance other:
        public int CompareTo(Personne other)
        {
            return this.Prenom.CompareTo(other.Prenom);
        }


Whismeril
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut,

Pour générer une liste triée à partir d'une liste (ça ne touche pas à la liste originale), tu peux utiliser la méthode d'extension "OrderBy()".

IOrderedEnumerable listeTriee liste.OrderBy(elt> elt.Nom).ThenBy(elt => elt.Prenom);


Remarques :
- Puisque les string sont, de base, comparables, si tu as une List<string>, tu peux juste mettre .OrderBy(elt => elt).
- "elt" peut être remplacé par ce que tu veux. C'est juste le nom que tu donnes à l'élément courant.
- Le "ThenBy()" est facultatif. Tu peux aussi en mettre plusieurs si tu le souhaites.
- Tu peux, derrière, appeler la méthode .ToList() pour récupérer une List<T> plutôt qu'un IOrderedEnumerable<T>.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
14854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 octobre 2020
444
Ha oui certes, mais comme plus haut il avait été question d'implémenter Icomparable, je n'ai pas changé de méthode.



Whismeril
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Oui, mais moi je suis un ouf ! Je change de méthode ^^

Non, plus sérieusement, implémenter IComparable, c'est très bien pour les classes sur lesquelles on va faire le même tri régulièrement. Je présentais juste une façon simple si l'on cherche ponctuellement à trier un IEnumerable.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -