HashTable(string , LinkedList<string> ) => Comment accéder aux données ?

Signaler
Messages postés
3
Date d'inscription
samedi 11 février 2006
Statut
Membre
Dernière intervention
19 juin 2009
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonjour,

J'aimerais réaliser une table de hachage avec comme clé un string et comme value une LinkedList de string (dans un premier temps puis une LinkedList d'objets dans un deuxième temps).

Pour le moment je reste bloqué, voici mon code :

 Hashtable HashTbleStr = new Hashtable();
            LinkedList<string> ll = new LinkedList<string>();
            ll.AddLast("elem01");
            HashTbleStr.Add("clé", ll);
            LinkedList<string> ll2 = new LinkedList<string>();
            ll2.AddLast("elem02");
            HashTbleStr.Add("clé2", ll2);

            IDictionaryEnumerator iEnum = HashTbleStr.GetEnumerator();
            while (iEnum.MoveNext())
            {
                MessageBox.Show(iEnum.Key + ":" + iEnum.Value);
            }

Ce qui me donne comme résultat :
 clé:System.Collections.Generic.LinkedList`1[System.String]
 clé2:System.Collections.Generic.LinkedList`1[System.String]

Ce que je n'arrive pas à saisir c'est que si IEnum.Value est ma liste pq je ne peux pas y accéder en faisant :
" iEnum.Value.ElementAt(0).ToString()" ?

Merci d'avance

9 réponses

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

1) Tout d'abord, je ne crois pas qu'une LinkedList ait une méthode ElementAt().
=> Utilise peut-être une List<string> tout simplement

2) Tu as essayé de faire un cast ?
=> (iEnum.Value as LinkedList<string>).First.Value (pas besoin de .ToString(), car c'est déjà une LinkedList de string)
ou si tu utilises une List<string> au lieu d'une LinkedList<string>
=> (iEnum.Value as List<string>)[0]

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Essayes ceci:





LinkedList

<


string

> ll1 =


new





LinkedList

<


string

>();
ll1.AddLast(


"elem01"

);



LinkedList

<


string

> ll2 =


new





LinkedList

<


string

>();
ll2.AddLast(


"elem02"

);

Dictionary<
string,
LinkedList<
string>> dic =
new
Dictionary<
string,
LinkedList<
string>>();

dic.Add(

"cl1"

, ll1);
dic.Add(


"cl2"

, ll2);



foreach

(


var

elem


in

dic)
{
  


Console

.WriteLine(elem.Value.First.Value);
}







<hr />
-Blog-
-Site Perso-
Messages postés
3
Date d'inscription
samedi 11 février 2006
Statut
Membre
Dernière intervention
19 juin 2009

Effectivement, erreur de casting, il y voyait un type Object pas une LinkedList.

J'utilise maintenant Dictionary et ça marche au poil, merci à vous 2
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Ben en fait, c'est justement la différence entre une HashTable et un Dictionary, le Dictionary est typé.

@Bidou : Le foreach est clairement plus simple qu'un enumerator fait manuellement, mais y a-t-il moyen de récupérer la clé / l'indice de l'élément du Dictionary / de la List dans un foreach ?

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
krimog> pas compris? la clé? avec elem.Key?

<hr />
-Blog-
-Site Perso-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
oui, cette clé là.
Y a-t-il moyen de la récupérer dans un foreach ?

De la même manière, y a-t-il moyen de récupérer l'indice de l'élément d'une List en cours de parcours dans un foreach ?

(Je pense que non, mais ça ne coûte rien de demander)

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
"Le foreach est clairement plus simple qu'un enumerator fait manuellement, mais y a-t-il moyen de récupérer la clé / l'indice de l'élément du Dictionary / de la List dans un foreach ?"

Un foreach est un enumerator, les deux font la même chose.
C'est une simplification d'écriture... un des nombreux "sucre syntaxique" de C#.

Concernant ton histoire de clé, je vois pas trop où tu veux en venir.
Un exemple de code de ce que tu aimerais faire ?

<hr />
-Blog-
-Site Perso-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
"Un foreach est un enumerator, les deux font la même chose"
=> C'est pour ça que j'ai précisé "fait manuellement" (je veux dire que c'est plus simple de le faire automatiquement).

Je reconnais que j'ai mal posé ma question (qui de toutes façons n'est pas un vrai problème, puisqu'on peut créer son enumerator manuellement),

mais, tout simplement si je reprends son code d'origine :
            IDictionaryEnumerator iEnum = HashTbleStr.GetEnumerator();
            while (iEnum.MoveNext())
            {
                MessageBox.Show(iEnum.Key + ":" + iEnum.Value);
            }

Avec un foreach :
            foreach(object o in HashTbleStr)
            {
                MessageBox.Show(??? + ":" + o);
            }
Je fais comment pour connaître la clé de mon élément afin de la mettre à la place de "???" ? (mais je ne suis pas sûr du tout que ce soit faisable)

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Ben je te l'ai dit dans mon message du dessus:
elem.Key

pour toi, un enumerator fait "manuellement", c'est quoi? Appeler GetEnumerator?
Si oui, alors c'est bel est bien la même chose qu'un foreach... pas de différence, juste un sucre syntaxique.

<hr />
-Blog-
-Site Perso-