2012-02-08 11 views
5

to jest mój pierwszy wpis!Dodawanie do słownika w słowniku

Nie jestem jeszcze pewnym programistą, ale do niego dotarłem.

Moim problemem jest to, że mam

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

Jeśli słownik nie zawiera bieżący klucz (String), można łatwo dodać klucz i innego słownika, który został wypełniony, podobnie jak .. .

testDictionary.Add(userAgentResult, allowDisallowDictionary); 

To działa dobrze, mój problem jest, gdy próbuję dodać wewnętrzną słownika jeśli userAgentResult Key już istnieje.

miałem nadzieję zrobić to w ten sposób ...

testDictionary[userAgentResult].Add(allowDisallowDictionary); 

ale metoda .Add chce dwa argumenty, to znaczy wartość klucza i listy ciągów. Poszedłem więc na napisać ten kod ...

//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); 

Działa to również, moim problemem jest to, że słownik ten jest dodawany do wielu razy, a gdy wewnętrzny słownik zawiera już klucz, który stara się być dodawane, to oczywiście błędy. Więc kiedy

Odpowiedz

3

W tym przypadku nie należy dodawać wpisu do słownika wewnętrznego. Musisz dodać wartość do pary klucz-wartość ze słownika zewnętrznego. Tylko tym razem wartość dzieje się kolejny słownik :)

testDictionary[userAgentResult] = allowDisallowDictionary;

+0

Przepraszam, że zajęło mi tak długo, aby odpowiedzieć, ale kiedyś tę sugestię i wydawało się działać prawidłowo! –

+0

Świetnie! Jeśli uważasz, że jest to właściwa odpowiedź, zaznacz ją jako odpowiedź. –

0

Musisz zrobić to samo dla wewnętrznego słownika, który zrobiłeś dla zewnętrznego. Najpierw sprawdź, czy lista już istnieje dla tego klucza. Jeśli nie, stwórz go. Następnie użyj listy, która istniała lub została utworzona.

1

może ja nie rozumiem problemu. Najpierw upewnij się, że słowniki istnieją tak:

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

Wtedy jesteś wolny, aby dodać elementy tak:

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

Prawdopodobnie uprościć to przez posiadające jeden słownik i łączenia klucze więc „symulowanie” zgrupowanie.

string key = userAgentResult + allowDisallowKey; 

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

testDictionary[key] = list; 

Po prostu trzeba zarządzać jednym słownikiem.

+0

ta sugestia pomogła mi, dzięki –

+0

Ten upraszcza całość. Twoje zdrowie!! – Arjmand

1

Podczas używania zagnieżdżonych słowniki i normalnie korzystać z tego podejścia:

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); 
    } 
} 
Powiązane problemy