2012-02-08 20 views
5

¡esta es mi primera publicación!Agregando a un diccionario dentro de un diccionario

No soy un programador particularmente seguro todavía pero estoy llegando allí.

Mi problema es que tengo una

static Dictionary<string, Dictionary<string, List<string>>> testDictionary = ... 

Si el diccionario no contiene la clave actual (cadena), puedo agregar fácilmente la llave y otro diccionario que ha sido poblada, al igual que .. .

testDictionary.Add(userAgentResult, allowDisallowDictionary); 

que funciona bien, mi problema viene cuando estoy tratando de añadir el diccionario interior si la clave userAgentResult ya existe.

Tenía la esperanza de hacerlo de esta manera ...

testDictionary[userAgentResult].Add(allowDisallowDictionary); 

pero el método .Add quiere dos argumentos, es decir, la clave y la lista valor de cadena. Así que fui a escribir el código ...

//this list as the dictionary requires a list 
    List<string> testDictionaryList = new List<string>(); 
    //this method returns a string 
    testDictionaryList.Add(regexForm(allowResult, url)); 
    //this will add the key and value to the inner dictionary, the value, and then  
    //add this value at the userAgentKey 
    testDictionary[userAgentResult].Add(allowDisallowKey, testDictionaryList); 

Esto también funciona, mi problema es que este diccionario se añade a las numerosas veces, y cuando el diccionario interior ya contiene la clave que está tratando de ser añadido, obviamente, errores. Entonces cuando

Respuesta

3

En este caso, lo que necesita hacer es no agregar una entrada al diccionario interno. Necesita agregar el valor al par clave-valor del diccionario externo. Sólo que esta vez el valor pasa a ser otro diccionario :)

testDictionary[userAgentResult] = allowDisallowDictionary;

+0

sentimos que ha tomado tanto tiempo para mí para responder, pero se utiliza esta sugerencia y nos ha parecido que funciona bien! –

+0

¡Genial! Si crees que esta es la respuesta correcta, márcala como respuesta. –

0

Necesita hacer lo mismo para el diccionario interno que para el externo. Primero compruebe si ya existe una lista para esta clave. Si no es así crearlo. Luego use la lista que ya existía o que se creó.

1

Tal vez que no entiendo su problema. En primer lugar asegurarse de que existen diccionarios de este modo:

if (!testDictionary.ContainsKey(userAgentResult)) 
    testDictionary[userAgentResult] = new Dictionary<string, List<string>>(); 
if (!testDictionary[userAgentResult].ContainsKey(allowDisallowKey)) 
    testDictionary[userAgentResult][allowDisallowKey] = new List<string>(); 

Entonces que son libres de añadir elementos de este modo:

testDictionary[userAgentResult][allowDisallowKey].Add("some value"); 
testDictionary[userAgentResult][allowDisallowKey].AddRange(someValueList); 
4

que probablemente simplificar esto por tener un diccionario y uniendo las claves de este modo "simulación" una agrupación.

string key = userAgentResult + allowDisallowKey; 

static Dictionary<string, List<string> testDictionary = ... 

testDictionary[key] = list; 

Simplemente necesita administrar un diccionario.

+0

esta sugerencia me ayudó, gracias –

+0

Esto simplifica todo. ¡¡Aclamaciones!! – Arjmand

1

Al utilizar diccionarios anidados suelo utilizar este enfoque:

private static Dictionary<string, Dictionary<string, List<string>>> _NestedDictionary = new Dictionary<string, Dictionary<string, List<string>>>(); 

private void DoSomething() 
{ 
    var outerKey = "My outer key"; 
    var innerKey = "My inner key"; 
    Dictionary<string, List<string>> innerDictionary = null; 
    List<string> listOfInnerDictionary = null; 

    // Check if we already have a dictionary for this key. 
    if (!_NestedDictionary.TryGetValue(outerKey, out innerDictionary)) 
    { 
     // So we need to create one 
     innerDictionary = new Dictionary<string, List<string>>(); 
     _NestedDictionary.Add(outerKey, innerDictionary); 
    } 

    // Check if the inner dict has the desired key 
    if (!innerDictionary.TryGetValue(innerKey, out listOfInnerDictionary)) 
    { 
     // So we need to create it 
     listOfInnerDictionary = new List<string>(); 
     innerDictionary.Add(innerKey, listOfInnerDictionary); 
    } 

    // Do whatever you like to do with the list 
    Console.WriteLine(innerKey + ":"); 
    foreach (var item in listOfInnerDictionary) 
    { 
     Console.WriteLine(" " + item); 
    } 
} 
Cuestiones relacionadas