IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C# 2.0] Détecter les doublons dans une List<string>


Sujet :

Windows Forms

  1. #21
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    Chapeau bas monsieur, Cela fonctionne nikel !

    J'abuse mais à titre d'information, je me demandais pourquoi tu faisais une comparaison entre 2 string en utilisant == plutot que .Equals ?

    Merci beaucoup mehdi_tn !

  2. #22
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    Medhi, pour tout te dire, ma liste contient environ 115 000 objets.

    J'ai commencé par faire un tri au préalable mais je commence à me demander si cela est nécessaire pour lancer ma comparaison d'objet.

    Le traitement est vraiment très long ...

  3. #23
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par mehdi_tn
    Parce que la comparaison se fait par defaut sur les references, tu dois modifier ce comportement.
    Encore une question, je sais je commence à être pénible

    La comparaison se fait sur les références ? cela veut dire quoi exactement ?

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    ça signifie qu'il regarde l'adresse ou est stockée la valeur et non la valeur elle même si je ne me trompe pas.
    Je te fais une analogie facile a capter :
    Jean dupont et jean dupont sont deux jumeaux ils ont la même adress ele même age, les même parent etc... ils sont identique et pourtant ce sont 2 individu different donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Jean dupont <> Jean dupont
    Pour que tes deux individu jean dupont soit considéré comme identique tu doit créer une "règle" qui dit par exemple :
    Si l'individu A a le même age et la même adresse que l'individu B alors il sont considéré comme étant identique
    Voilà
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  5. #25
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    Merci ekinox17.

    pourrais tu aussi me répondre aussi simplement pour mes autres questions ?

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    je me demandais pourquoi tu faisais une comparaison entre 2 string en utilisant == plutot que .Equals ?
    c'est pareil juste une question de synataxe, le double egal est peut etre même plus rapide a executé enfin je ne sais pas je n'ai pas tester, mais a l'origine le double egal est un signe comparatif du langage C tantdis que la fonction equal est une fonction implementé par la framework.

    Medhi, pour tout te dire, ma liste contient environ 115 000 objets.

    J'ai commencé par faire un tri au préalable mais je commence à me demander si cela est nécessaire pour lancer ma comparaison d'objet.

    Le traitement est vraiment très long ...
    Aïe ça fait beaucoup, tu te demande si cela est necessaire de trier pour les comparé ? et bien non tu devrais relire les très bon conseils de mehdi_tn qui a dit qu'il était parti sur une mauvaise voie.
    Il t'as réorienté en te disant que cela n'etais pas nécessaire mais que tu devais plutot implementer IEquatable et non pas IComparable.
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  7. #27
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par ekinox17
    Voilà
    Merci ekinox17 pour l'aide . Je vais essayer d'expliquer pareil.

    Citation Envoyé par dacamp
    je me demandais pourquoi tu faisais une comparaison entre 2 string en utilisant == plutot que .Equals ?
    supposons que tu as deux string jumeaux Jean Batiste et Jean dupont. Leur pere qui est le framework dot net est aveugle, il doit utiliser la méthode equals qui va comparer l'age l'adresse et tout le reste pour reconnaitre ses jumeaux. La mere du framework est aveugle aussi comme par hasard, mais elle n'aime pas utiliser la fonction equals pour une raison que je ne connais pas. Mais elle connais un opérateur == qui pourrait faire l'affaire. Alors elle demande à son mari Mr framework dot net de surcharger cet opérateur pour qu'il soit utilisé comme le equal. Voila maintenant tu peux comparer les string soit avec equals ou ==. Mais à la base == est utiliser pour comparer les references comme ekinox17 te la bien expliqué. Voir Override operator equals on overloading add and subtract , pour plus d'explication.

    Maintenant pour l'histoire du tri. Si tu veux que ta liste soit tout le temps triée dans ce cas utilise plutôt la collection SortedList ou SortedDictionary en ignorant les valeurs (c'est des structures Clé/Valeur). Tu trouveras dans ces liens la difference entre ces deux Collections. A priori c'est la SortedDictionary qu'il te faut.

    L'autre moyen c'est d'utiliser la fonction Sort de ta list, là c'est normal que le traitement soit long.

    Dans tous les cas il faut implémenter IComaparable dans ta classe ou passer un objet Icomparer, au moins notre discussion aura servi
    Mehdi Feki : Modérateur .Net

  8. #28
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    Encore merci Mehdi.

    Pour continuer sur ma lancée et comme tu connais le sujet, j'ai une autre question. Comme je commence à mieux comprendre les interfaces, je me lance dans un dev qu'auparavant j'aurais contourné ...

    Je désire utiliser un foreach afin de parcourir chaque élément de mon objet distri. (mes attributs sont tous des strings)
    Donc je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach (String v_element in distri)
    {
    }
    Malheureusement cela ne fonctionne pas et pour cause il n'existe pas de méthode GetEnumerator dans ma classe Distri.
    tu vois, je progresse

    Par contre,ensuite je sechè

    Tu peux m'expliquer car comme ma classe herite deja de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Distri : IEquatable<Distri>
    Comment je peux faire ?

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 122
    Points : 124
    Points
    124
    Par défaut
    Je crois qu'il faut implémenter IEnumerable

  10. #30
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    Bon j'ai la réponse à ma dernière question même si je ne sais pas si cela est la meilleure méthode.

    Dans ma classe Distri j'ajoute la méthode GetEnumerator comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
            public IEnumerator<string> GetEnumerator()
            {
                string[] v_listElements = new string[23];
                v_listElements[0] = m_codeOPE;
                v_listElements[1] = m_numOPE;
                v_listElements[2] = m_statutOP;
     
                foreach (string v_element in v_listElements)
                {
                    yield return v_element;
                }
            }
    ensuite je peux utiliser le foreach sur mon objet v_distri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach (string v_element in v_distri)
    {
    (...)
    }
    Maintenant je repete que cela n'est peut etre pas la bonne méthode mais elle fonctionne. Je suis à l'écoute de toute suggestion sur le sujet.

  11. #31
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Just ajouter que c'est mieux d'utiliser StringCollection (C# 2.0)
    Eviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<string> lst = new List<string>();
    Mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringCollection lst = new StringCollection();
    Even the biggest journey, starts with a single step.

  12. #32
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    ok merci pour cette précision.

  13. #33
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    j'ai une question pratique ... je ne trouve plus le tag résolu, normal ?

  14. #34
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    tout a fait normal, vu que tu n'es pas l'auteur du premier post
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  15. #35
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Points : 77
    Points
    77
    Par défaut
    LOL ... pas con en effet

  16. #36
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    A partir du .NET 3.5, on peut faire plus simple pour savoir si la liste a des doublons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (maList.Count == maList.Distinct().Count()) {
    // Pas de doublon
    } else {
    	// Ya des ou un doublon
    }

  17. #37
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut En une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     L.RemoveAll(Function(s As String) L.FindAll(Function(ss As String) ss = s).Count > 1)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Supprimer les doublons dans une liste
    Par inforum dans le forum SL & STL
    Réponses: 2
    Dernier message: 22/11/2009, 15h21
  2. Réponses: 9
    Dernier message: 30/12/2008, 19h21
  3. Enlever les doublons dans une liste
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 14/09/2007, 17h46
  4. [XSLT] probleme avec les doublons dans une liste deroulante
    Par mikooo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/04/2007, 15h37
  5. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo