Affichage des doublons d'une liste

TomTom - 17 janv. 2017 à 14:16 - Dernière réponse : Whismeril 10512 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention
- 17 janv. 2017 à 18:50
Bonjour, j'ai une liste :
IList<Article> listeArticles

chaque Article contient un attribut Numero ; auriez vous une méthode pour afficher dans une autre liste uniquement les articles dont le Numero est présent plusieurs fois ?
IList<Article> listeArticlesDoublons

J'ai pensé faire un foreach dans un foreach mais vu que la méthode se fait sur plus de 70 000 valeurs, l'opération est très longue, je cherche donc une alternative plus optimisée.
Merci d'avance.
P.S : je débute en C#
Afficher la suite 

2 réponses

Répondre au sujet
Whismeril 10512 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 17 janv. 2017 à 14:55
0
Utile
Bonjour

en faisant un groupBy, suivi d'un Where ou tu sélectionnes les groupes qui ont plus d'un item.

Je ne peux pas te faire un exemple là, mais ce soir, je te posterai ça.

En attendant
http://codes-sources.commentcamarche.net/faq/784-presentation-de-linq-avec-c
https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
Commenter la réponse de Whismeril
Whismeril 10512 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 17 janv. 2017 à 18:50
0
Utile
Voilà l'exemple, j'avais une liste de Personne sous la main, dont 2 ont la même date de naissance.

            mesPersonnes.Add(new Personne { Nom = "Sort", Prenom = "Jean", DateNaissance = DateTime.Parse("01/01/2001") });
            mesPersonnes.Add(new Personne { Nom = "Dit", Prenom = "Alain", DateNaissance = DateTime.Parse("06/06/1990") });
            mesPersonnes.Add(new Personne { Nom = "Zètofrais", Prenom = "Mélanie", DateNaissance = DateTime.Parse("01/01/2001") });
            mesPersonnes.Add(new Personne { Nom = "Meliès", Prenom = "Georges", DateNaissance = DateTime.Parse("01/01/2000") });
            mesPersonnes.Add(new Personne { Nom = "Alotre", Prenom = "Alain", DateNaissance = DateTime.Parse("02/01/2001") });
            mesPersonnes.Add(new Personne { Nom = "Dupont", Prenom = "Tintin", DateNaissance = DateTime.Parse("01/02/2000") });


            List<IGrouping<DateTime,Personne>> groupes = mesPersonnes.GroupBy(p => p.DateNaissance).ToList();

            List<IGrouping<DateTime,Personne>> listeGroupesAuMoins2 = groupes.Where(g => g.Count() > 1).ToList();






Comme tu le vois sur la 1er capture "groupes" contient 5 enregistrements au lieu de 6 et le premier groupe contient bien les 2 personnes qui ont la même date de naissance.

Sur la seconde capture, il ne reste plus qu'un groupe, qui est bien celui avec 2 personnes.

Le résultat à ce stade est une liste de IGrouping<..>, donc une collection d'objets avec entre autre la propriété Key, qui est la propriété avec laquelle tu as groupé les données et la collection des items correspondant à cette Key.

Si ce format de données te convient, pas la peine d'aller plus loin.
Mais si tu veux une collection sans collection sous jacente, il faut une requête de plus

            List<Personne> doublons = (from g in listeGroupesAuMoins2
                                       from p in g
                                       select p).ToList();


On peut faire tenir tout ça dans une seule instruction
            List<Personne> doublons = mesPersonnes.GroupBy(p => p.DateNaissance).Where(g => g.Count() > 1).SelectMany(g => g).ToList();


Mais ça me parait plus lisible pour un débutant de décomposer.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.