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 :

Recuperation des donnée d'une hashtable


Sujet :

C#

  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut Recuperation des donnée d'une hashtable
    Bonjour,
    Je me bagarre avec une collection Hashtable.
    Dans cette collection, je stocke des données recuperer d'un XML
    chaque hashtable contiens:
    La clef et l'objet Collection.LaCollection () c'est une classe qui décortique mes donnée recuperer.

    J'ai réussi sans problème en Vb.net mais j'arrive pas a reproduire la même chose avec C#.

    Voici comment je charge ma Collection en VB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Co As New Collection
    Co = CollMesure(CollMesure.Keys(i)) 'CollMesure étant mon Hashtable
    Ensuite j'ai plus qu'a recuperer mes info avec Co.Nom ou Co.Format etc..

    Voici ce que j'ai fait en C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    string Supervision;
    Co = new Collection.LaCollection ();
    Supervision = comboBox1.Text;
     ListeMesures = new Hashtable();
    ListeMesures = GXml.Liste_ObjetMesures("params.xml", Supervision); // cela me rempli ma Hashtable.
     
    //Pour recuperer mes info dans m'a hashtable il faut que je remplisse m'a collection Co.
    // J'ai essayé
    Co = ListeMesures.Keys(i);
    Co = ListeMesures(CollMesure.Keys(i));
    Co = ListeMesures[CollMesure.Keys(i)];
    //etc.... Mais il me fait une erreur a chaque.
    Merci de votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Les indices en C# se mettent entre crochet [i] PAS des parentheses (i)

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Et tu devrais utiliser les collections génériques plutôt que les collections .NET 1

  4. #4
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Bonjour à vous,
    Merci d'avoir répondu.

    J'ai essayé aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Co = ListeMesures[CollMesure.Keys[i]];
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Co = ListeMesures(CollMesure.Keys[i]);
    Mais cela ne marche pas.

    En analysant ce que j'ai trouvé, celle ci aurait du être la bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Co = ListeMesures[CollMesure.Keys[i]];

    En ce qui concerne l'utilisation des collections .Net pourriez vous argumenté ce choix de ne pas les prendre car si elle sont disponible, je vois pas pourquoi ne pas les utilisés (il y a surement une bonne raison). Et dans ce cas qu'elle collection je devrais utilisé pour cela.

    Sachant que pour le moment je connait que le C/C++ ainsi que le VB.net(2008) que j'ai fait pendant mon stage.(J'ai 39 ans et suis en reconversion actuellement)

    Enfaite j'ai presque fini mon programme en VB et vu que c'est moi qui a amené ce sujet au prof pour en faire un projet pour le BTS IRIS, mais en C#.

    Pendant un moment j'avais pas trouvé de Hashtable en C# j'avais donc fait une tentative avec Dictionary que j'ai abandonné uniquement parce que j'ai vu qu'il y avais bien des hashtables.

    Pourriez vous me proposer une idée s'il vous plait, pour que je sorte de cette impasse qui doit surement être une bêtise de m'a part.

    Merci

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Tu peux copier une HashTable dans une ArrayList

    Methode CopyTo

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Travailler avec Dictionary permet, lorsqu'on utilise les valeurs, de travailler directement avec les bons types, plutôt que d'utiliser la classe Object, et devoir caster à chaque fois vers le bon type.

    Si vous avez ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    dictionary.Add("Toto", 1);
    dictionary.Add("Foo", 2);
     
    int val = dictionary["Toto"]; //val vaut 1 ici

  7. #7
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Je viens de rentrer, pour se soir cela va être dur de si remettre. Mais afin de mieux comprendre mon fonctionnement, voici ma classe collection.
    En VB.net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    Public Class Collection
    #Region "Champs privés"
        Private _Nom As String
        Private _Obj As String
        Private _Ind As String
        Private _Format As Double
        Private _Unit As String
        Private _Selection As Boolean
        Private _SelectInter As Boolean
        Private _SeuilInter As Double
        Private _SelectCourbe As Boolean
    #End Region
    #Region "Constructeur"
        Sub New()
            _Nom = ""
            _Obj = ""
            _Ind = ""
            _Format = 0
            _Unit = ""
            _Selection = False
            _SelectInter = False
            _SeuilInter = 0
            _SelectCourbe = False
        End Sub
    #End Region
    #Region "Propriétés publiques"
        Property Nom() As String
            Get
                Return _Nom
            End Get
            Set(ByVal value As String)
                _Nom = value
            End Set
        End Property
        Property Obj() As String
            Get
                Return _Obj
            End Get
            Set(ByVal value As String)
                _Obj = value
            End Set
        End Property
        Property Ind() As String
            Get
                Return _Ind
            End Get
            Set(ByVal value As String)
                _Ind = value
            End Set
        End Property
        Property Format() As Double
            Get
                Return _Format
            End Get
            Set(ByVal value As Double)
                _Format = value
            End Set
        End Property
        Property Unit() As String
            Get
                Return _Unit
            End Get
            Set(ByVal value As String)
                _Unit = value
            End Set
        End Property
        Property Selection() As Boolean
            Get
                Return _Selection
            End Get
            Set(ByVal value As Boolean)
                _Selection = value
            End Set
        End Property
        Property SelectInter() As Boolean
            Get
                Return _SelectInter
            End Get
            Set(ByVal value As Boolean)
                _SelectInter = value
            End Set
        End Property
        Property SeuilInter() As Double
            Get
                Return _SeuilInter
            End Get
            Set(ByVal value As Double)
                _SeuilInter = value
            End Set
        End Property
        Property SelectCourbe() As Boolean
            Get
                Return _SelectCourbe
            End Get
            Set(ByVal value As Boolean)
                _SelectCourbe = value
            End Set
        End Property
    #End Region
    End Class
    Pour chaque appareil j'ai plusieurs fois sa. Cela peut aller d'une 10ene à plus de 50.

    Je vais continuer pour le moment avec mon hastable, il y a pas de raison qu'elle ne marche pas comme j'ai fait avec le VB.

    En tout cas merci pour vos informations. J'essayerais peut être la Dictionary qui semble être du même genre.

  8. #8
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    En faite, j'arrive à charger ma hashtable avec la keys et ma classe collection.

    mais ce que je veut pouvoir retourner c'est la liste des keys. je viens de me rendre compte que c'est pas tout a fait ce que j'essayais de faire.

    Une fois le tout charger je veut recuperer cette liste pour l'afficher dans une listbox. Ensuite je sélectionnerais ma Key que j'ai besoin et je pourais charger avec cette Key vers ma collection.

    j'avais oublier une étape.

    j'ai donc tenter sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ArrayList Liste = new ArrayList();
     
    For (int i =0 ; i<=ListeMesures.Count-1 ; i++)
    {
          Liste[i] = ListeMesures[i];
    }
    ListBox1.DataSource =  Liste;
    Sa compile mais il se bloque avec erreur d'index au premier passage.

    une idée....

  9. #9
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Tout a déja été dit pourtant

    1- La methode Hastable.Toarray

    2- Mais aussi le conseil de charger plutot une liste et ensuite constituer un dictionnnaire dessus plutot que de charger directement une HashTable

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Citation Envoyé par megamario Voir le message
    Je vais continuer pour le moment avec mon hastable, il y a pas de raison qu'elle ne marche pas comme j'ai fait avec le VB.
    Oui, et tu peux aussi ne pas le faire en OO, il n'y a pas de raison que ça ne marche pas non plus...

    Il n'y a que des avantages à utiliser les listes génériques: on utilise le type directement, et on évite de faire du boxing / unboxing à tout va.

    Et dans ton cas, si tu utilises Dictionnary, tu as une propriété Keys qui te retourne... tes clés.

  11. #11
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Merci a vous tous,

    Je prend note pour prendre une Dictionnary. Je vais essayer en tout cas.


    Mais bon ce matin j'ai trouvé juste avant de partir au lycée, ce n'est aps comme sa que j'ai fait pour le VB mais cela marche en C#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
               string Supervision;
                ArrayList Liste = new ArrayList();
                Supervision = comboBox1.Text;
                ListeMesures = new Hashtable();
                ListeMesures = GXml.Liste_ObjetMesures("params.xml", Supervision);
                foreach (string Key in ListeMesures.Keys)
                {
                    Liste.Add (Key);
                }
                listBoxNom.DataSource =  Liste;
    J'avais utilisé les Foreach, je connaissait pas.

    Merci de votre soutien.

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci de votre soutien
    Heureusement que tu te satisfait de notre soutien, car apparement tu n'a vraiment pas envie d'ecouter l'aide qu'on essaye de te donner !

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Citation Envoyé par megamario Voir le message
    Je prend note pour prendre une Dictionnary. Je vais essayer en tout cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string Supervision;
                ArrayList Liste = new ArrayList();
                Supervision = comboBox1.Text;
                ListeMesures = new Hashtable();
                ListeMesures = GXml.Liste_ObjetMesures("params.xml", Supervision);
                foreach (string Key in ListeMesures.Keys)
                {
                    Liste.Add (Key);
                }
                listBoxNom.DataSource =  Liste;
    Voilà la version avec les génériques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string Supervision;
    List<string> Liste = new List<string>();
    Supervision = comboBox1.Text;
    Dictionary<string, string> ListeMesures = GXml.Liste_ObjetMesures("params.xml", Supervision);
     
    foreach (string Key in ListeMesures.Keys)
    {
    Liste.Add (Key);
    }
     
    listBoxNom.DataSource =  Liste;
    Je ne connais pas le type de retour exact de ta fonction GXml.Liste_ObjetMesures, du coup j'ai remis string.

    Je peux comprendre que tu ne vois pas vraiment l'avantage de cette solution, car le DataSource demande un objet de type Object, donc tu peux lui passer n'importe quoi.

    Maintenant, imagine que tu aies besoin d'ajouter du texte à la fin de chaque élément de ta liste.

    Tu pourrais très bien faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList Liste = new ArrayList();
    //Tu insères des strings
     
    foreach (string val in Liste)
      val += "_suffix";
    Sauf que le foreach (string val in Liste) va te convertir chaque objet dans ta liste du type Object vers le type string. C'est ce qu'on appelle l'unboxing. C'est couteux en performances. Et une erreur de cast est vite arrivée dans des cas plus complexes qu'une simple énumération comme ici.

    Si par contre tu utilises les génériques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<string> Liste = new List<string>();
    //Tu insères des strings
     
    foreach (string val in Liste)
      val += "_suffix";
    Là sur cette ligne : foreach (string val in Liste) tu ne changes pas le type des objets de ta collection, vu que dès le départ ce sont des strings.

    Si tu as par exemple une collection d'objets de type Foo, qui est une classe contenant une propriété de type int nommé Toto, tu pourrais l'utiliser comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Foo> list = new List<Foo>();
    list.Add(new Foo();
     
    list[0].Toto = 3;
    alors qu'en non-générique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ArrayList list = new ArrayList();
    list.Add(new Foo();
     
    ((Foo)list[0]).Toto = 3;
    Voilà, j'espère avoir été clair.

    Autre précision: Apparemment la programmation n'est pas ton métier. Si tu espères que ça le sera un jour, prends tout de suite les bonnes habitudes au niveau des noms de tes variables: en anglais, et pas de majuscules à tout va. Mais ça c'est accessoire

  14. #14
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Je conseille aussi les Liste et un Dictionaire

  15. #15
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Surtout que j'ai pas toujours le temps de faire tout ce que je veut, reprendre ses études après 20 ans, sans aucune vacances (car en stage pendant les vacances scolaire) et avec 2 jeunes enfants à gerer c'est pas simple tout les jours, alors merci de votre aide précieuse.

  16. #16
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonsoir

    Courage et bonne chance

    Un conseil encore
    Si tu veux apprendre vite et bien, garde toujours leux yeux ouvert sur TOUTES les solutions possibles a une question .
    Et prends aussi parfois le temps de les essayer, sans t'acharner sur la solution que tu a choisi ou que tu crois etre bonne
    Au final tu apprendra plus et plus vite et et tu gagnera largement ce temps consacré a quelques essais.

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

Discussions similaires

  1. probleme de recuperation des données d'une bd
    Par mystro7200 dans le forum Struts 1
    Réponses: 5
    Dernier message: 02/12/2008, 20h31
  2. Recuperer des données d'une fonction JS
    Par dad72 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/11/2008, 19h22
  3. recuperation des données d'une combo box
    Par Kevin.Perez dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 25/04/2008, 12h29
  4. recupere des donnes d'une page excel
    Par marouane2010 dans le forum Visual C++
    Réponses: 3
    Dernier message: 19/11/2006, 10h03
  5. recupere des données d'une requete
    Par torNAdE dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/07/2006, 10h38

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