2010-01-15 4 views
3

Mon exigence estComment utiliser le dictionnaire imbriqué en C#?

Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>> 

Lorsque je tente d'obtenir la valeur du dictionnaire interne en utilisant la clé (outerString), il donne une erreur disant « ne peut pas appliquer l'indexation avec le type d'expression ........ ....... ".

J'ai essayé

Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>> dict1 = new 
    Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>>; 

Dictionary<innerString, List<SelectListItem>> dict2 = dict1.values["outerString"]; 

Toute aide rapide sera grandement appréciée.

Thx à l'avance.

+3

'Dictionnaire >>', Bon Dieu! !! –

+1

C'est certainement un bon endroit pour utiliser 'var'. –

+0

qu'est-ce que innerString et outerString? –

Répondre

1

Vous ai-je mal compris? Cela fonctionne bien

Dictionary<string, Dictionary<string, List<string>>> list = new Dictionary<string, Dictionary<string, List<string>>>(); 
list.Add("test", new Dictionary<string, List<string>>()); 
Dictionary<string, List<string>> inner = list["test"]; 

ou

var list = new Dictionary<string, Dictionary<string, List<string>>>(); 
list.Add("test", new Dictionary<string, List<string>>()); 
Dictionary<string, List<string>> inner = list["test"]; 
+0

Thx Astander & autres pour une réponse rapide Je faisais list.values ​​["test"]; Mais, le besoin était liste ["test"]; – kumar

2

Alors outerString et innerString sont types? Vouliez-vous juste un dictionnaire imbriqué? string ->string ->List<SelectListItem>? Sinon, vous devrez nous montrer la définition de ces types, et donner au compilateur un moyen de convertir la string que vous essayez d'index avec ...

0

Dans

Dictionary<string, Dictionary<string, List<T>> dict1 = 
    new Dictionary<string, Dictionary<string, List<T>>(); 

vous avez besoin

List<T> list12 = dict1["key1"]["key2"]; 

List<int> list1 = new List<int>(); 
list1.Add(1); 
list1.Add(2); 

Dictionary<string, List<int>> innerDict = new Dictionary<string, List<int>>(); 
innerDict.Add("inner", list1); 

Dictionary<string, Dictionary<string, List<int>>> dict1 = 
    new Dictionary<string, Dictionary<string, List<int>>>(); 
dict1.Add("outer", innerDict); 

List<int> list2 = dict1["outer"]["inner"]; 
3

vous avez juste besoin de changer la dernière ligne de l'extrait de code (je suppose où vous avez écrit la chaîne intérieure et la chaîne externe, vous devez signifié string):

var dict = dict1["someValue"]; 

De plus, vous pouvez probablement rendre votre code beaucoup plus lisible avec le mot-clé var:

var dict1 = new Dictionary<string, Dictionary<string, List<SelectListItem>>>(); 
var dict = dict1["someValue"]; 
6

Je suppose que ce dont vous avez besoin est juste:

Dictionary<innerString, List<SelectListItem>> dict = dict1["someKey"]; 
2

vous étiez près:

Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>> dict1 = new 
Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>>(); 

// Get inner dictionary whose key is "someValue" 
Dictionary<innerString, List<SelectListItem>> dict = dict1["someValue"] 
0

Que diriez-vous d'utiliser un tableau de chaînes pour une clé, plutôt que d'essayer d'imbriquer les dictionnaires -

 Dictionary<string[], List<string>> dict = 
      new Dictionary<string[],List<string>>(); 

     string[] key = {"inner", "outer"}; 
     List<string> vals = new List<string>(); 

     dict.Add(key, vals); 
+1

Le dictionnaire repose sur la sémantique des méthodes Equals et GetHashCode. Aucune d'entre elles n'est implémentée sur les tableaux. En d'autres termes: var x = new string [] {"un", "deux"}; var y = nouvelle chaîne [] {"un", "deux"}; Console.WriteLine ("x == y? {0}", x.Equales (y)); Sorties: x == y? Faux – Logicalmind

Questions connexes