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

C# Discussion :

Quelle structure de données utiliser ?


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut Quelle structure de données utiliser ?
    Bonjour,

    Je voudrais créer un tableau contenant à droite un numero unique, et à sa gauche un mot qui peut apparaitre plusieurs fois.
    J'avais essayé NameValueCollection mais il n'autorise pas les clés multiples (il les remplacent).

    Que dois-je utiliser ?

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // uniq => mot
    "123" => "orange"
    "124" => "prune"
    "125" => "orange"  // autorisé
    "126" => "verte"
    "127" => "rouge"
    ...
    Merci !

  2. #2
    Membre actif Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Points : 236
    Points
    236
    Par défaut
    Salut.

    Si tes numéro se suivent, utilise simplement un tableau de string (string[]) ou bien une liste de string (List<string>), le mot sera l'élément stocké, et le numéro sera son index de stockage.. Sinon, tu peux utiliser un dictionnaire (Dictionary<int, string>) ou un dictionnaire trié (SortedDictionary<int, string>).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    Merci.
    Non mes numéro ne se suivent pas, l'exemple est mal fait
    Je peux passer du 125 au 129 sans qu'il n'y ai de numéro entre.

    De plus, je souhaite que la premiere colonne soit un string et non un int, car je veux pouvoir différencier un "0123" d'un "123" ! (donc pas de Dictionnaire à ce que je vois).

    Merci.

  4. #4
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Le dictionnaire me semble tout à fait indiqué dans ton cas. Y aurait-il une raison de ne pas l'utiliser ?

    Si tu peux faire un dico<string,string> !!!
    c'est à toi d'indiquer le type de la clef et celui de la valeur...

    va voir msdn concernant la classe Dictionary

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    Ok je vais voir merci.

  6. #6
    Membre actif Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Points : 236
    Points
    236
    Par défaut
    Alors, utilise un dictionnaire, tu l'utilise du la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                Dictionary<int, string> myDictionary = new Dictionary<int, string>();
                // le "int" représente le type de ta clé, celle-ci est unique.
                // le string représente le type de ton objet indexé, tu peux avoir des doublons
     
                if(myDictionary.ContainsKey(129)){  // On test si la clé est déjà utilisée
                    myDictionary.Add(129, "orange");    // On ajoute une nouvelle clé
                }
     
                myDictionary[129] = "noir"; // On modifie un élément à un edex existant
     
                Console.WriteLine(myDictionary[129]);   // On récupère un élément à un index donné.
    J'ai mis un entier comme clé, mais tu peux mettre ce que tu souhaite, un string ou bien un objet perso, ça fonctionne pareil.

    Attention à bien tester si une clé existe avant de vouloir y accéder.

    Le SortedDictionary est exactement pareil à la différence que quand tu le parcours, tes éléments sont trié par index (ils sont dans l'ordre d'insertion avec le Dictionary).

    Tu devrais y trouver ton bonheur.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    +1 pour le system.collections.generic.dictionary

  8. #8
    Membre actif Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Points : 236
    Points
    236
    Par défaut
    Quand je ne connaissait pas, je me débouillais autrement, maintenant, je ne m'en passe plus.

  9. #9
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Il a déjà essayé avec NameValueCollection, qui n'est au final rien d'autre qu'un dictionnaire dont la clé et la valeur sont des chaînes de caractères.

    Par contre ce que tu décris ne me semble pas logique. Tu dis d'abord
    Citation Envoyé par jeremm
    Je voudrais créer un tableau contenant à droite un numéro unique, et à sa gauche un mot qui peut apparaitre plusieurs fois.
    Puis
    Citation Envoyé par jeremm
    J'avais essayé NameValueCollection mais il n'autorise pas les clés multiples.
    Comme ça j'aurai tendance à croire que tu as utilisé le mot comme clé au lieu du numéro. Le mot pouvant apparaître plusieurs fois ça collerait avec ton "problème" de clés multiples. Et tu dis que le mot serait "à gauche", ce qui conforterait cette hypothèse.

    Si c'est bien le cas alors tu t'es trompé. La clé dans un dictionnaire est unique comme tu l'as constaté, c'est le principe de base. Ton numéro étant unique il est donc le parfait candidat pour une clé. Cela devrait mieux fonctionner dans ce sens. Dans le cas contraire, et pour mieux comprendre, un peu de code serait le bienvenu

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    En effet, Le Dictionnary à l'air de se comporter comme le NameValueCollection, il refuse les doublons.

    Voilà ce que j'ai fait, qui me provoque une exception de doublon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dictionary<string, string> dic = new Dictionary<string, string>();
     
    dic.Add("01230", "orange");
    dic.Add("00577", "vert");
    dic.Add("04011", "orange"); // exception 'orange' existe déjà. Je voudrais pourtant cela !
    ...
    En résumé, le 1er argument de Add() est unique, mais je le veux en string afin de conserver les zéros qui sont importants ; le 2nd argument peut etre en doublon.

    Quelle type de données utiliser ?!

    Merci de votre aide.

  11. #11
    Membre actif Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Points : 236
    Points
    236
    Par défaut
    Au final, que veux tu ???

    Un premier identifiant en string unique ("1" et "00001" sont différents, on est d'accord ??). Et un second avec doublon (répéter n fois "orange" par exemple à condition que le clé soit différente ??).

  12. #12
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour,

    Après un test rapide, en faisant un copier/coller de ton exemple, cela passe parfaitement chez moi ; comme il a été précisé dans un Dictionary<K, V> seul le premier paramètre donc de type K doit être unique le second tu peux en remplir le tableau qu'il s'en fiche pour preuve ce second exemple que je viens de vérifier (juste au cas où )
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dictionary<string, string> dic = new Dictionary<string, string>();
    for (int i = 0; i < 1000; i++)
    	dic.Add((string)i, "hello world");
    Cordialement

  13. #13
    Membre actif Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Points : 236
    Points
    236
    Par défaut
    Idem, RAS.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    Exat ! J'avais une erreur autre part que je n'avais pas vu, et c'était bien la clé (1er argument) qui était fautive.

    Meci bcp !!

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle structure de données utiliser
    Par grunk dans le forum Android
    Réponses: 8
    Dernier message: 07/11/2011, 15h04
  2. quelle structure de donnée par un arbre?
    Par rdh123 dans le forum C#
    Réponses: 1
    Dernier message: 31/12/2007, 15h27
  3. Quelle base de données utiliser avec c# ?
    Par rdh123 dans le forum C#
    Réponses: 3
    Dernier message: 19/10/2007, 07h59
  4. [C++] quelle structure de donnée utiliser pour stocker des vertices ?
    Par johnnyjohnny dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 14/07/2007, 21h44
  5. Quelle base de donnée utiliser?
    Par VTwin dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 01/07/2005, 12h34

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