2014-04-08 2 views
0

Я хочу создать вложенный ConcurrentDictionary после синтаксического анализа большого XML-файла. Что я получаю при запуске кода ниже, так это то, что самый внутренний (tmpDictionaryDid) словарь имеет значение NULL.Вложенный ConcurrentDictionary

Я думаю, что я не правильно сохраняю словари или загружаю их неправильно, но я не могу понять, что является неправильным.

Возможно ли решить эту проблему с помощью ConcurrentDictionary или попробовать другое решение?

public void temp22db() 
    { 
     ConcurrentDictionary<string, ConcurrentDictionary<string, string>> dictionary22 = new ConcurrentDictionary<string, ConcurrentDictionary<string, string>>(); 
     try 
     { 
      ConcurrentDictionary<string, string> did = new ConcurrentDictionary<string, string>(); 

      did.TryAdd("F186 1", "test1"); 
      did.TryAdd("F186 2", "test2"); 
      dictionary22.TryAdd("F186", did); 

      did.TryAdd("EDA0 1", "test3"); 
      did.TryAdd("EDA0 2", "test4"); 
      dictionary22.TryAdd("EDA0", did); 

      string test; 
      did.TryGetValue("EDA0 1", out test); 
      Helper.logInWindow("This works " + test); 
     } 
     catch (Exception e) 
     { 
      Helper.logInWindow("SDDBTemp: " + e.Message); 
     } 
     ecuDictionary2.TryAdd("1638", dictionary22); 
    } 

public string getDIDInterpretation() 
    { 
     string outStr = ""; 
     ConcurrentDictionary<string, ConcurrentDictionary<string, string>> tmpDictionary; 
     ecuDictionary2.TryGetValue("1638", out tmpDictionary); 

     if (tmpDictionary != null) 
     { 
      ConcurrentDictionary<string, string> tmpDictionaryDid; 
      tmpDictionary.TryGetValue("EDA0", out tmpDictionaryDid); 

      if (tmpDictionaryDid != null) 
      { 
       tmpDictionaryDid.TryGetValue("EDA0 1", out outStr); 
      } 
     } 

     Helper.logInWindow("Why U no work? " + outStr); 
     return outStr; 
    } 
+1

Вы должны стараться избегать гнездящихся на concurrentdictionaries - вы будете работать в более параллелизм проблемы с этим. Попробуйте объединить вложенные ключи только в один ключ, например, вместо dict [key1] [subkey1], сохраните его как dict [key1 + subkey1] – jaminto

ответ

0

Вы должны использовать его, как это вместо того, чтобы: (Родитель ConcurrentDictionary позволит параллелизм на внутренние словари)

public static void temp22db() 
    { 
     Dictionary<string, Dictionary<string, string>> dictionary22 = new Dictionary<string, Dictionary<string, string>>(); 
     try 
     { 
      Dictionary<string, string> did = new Dictionary<string, string>(); 

      did.Add("F186 1", "test1"); 
      did.Add("F186 2", "test2"); 
      dictionary22.Add("F186", did); 

      did.Add("EDA0 1", "test3"); 
      did.Add("EDA0 2", "test4"); 
      dictionary22.Add("EDA0", did); 

      string test; 
      did.TryGetValue("EDA0 1", out test); 
      Helper.logInWindow("This works " + test); 
     } 
     catch (Exception e) 
     { 
      Helper.logInWindow("SDDBTemp: " + e.Message); 
     } 
     ecuDictionary2.TryAdd("1638", dictionary22); 
    } 

    public static string getDIDInterpretation() 
    { 
     string outStr = ""; 
     Dictionary<string, Dictionary<string, string>> tmpDictionary; 
     ecuDictionary2.TryGetValue("1638", out tmpDictionary); 

     if (tmpDictionary != null) 
     { 
      Dictionary<string, string> tmpDictionaryDid; 
      tmpDictionary.TryGetValue("EDA0", out tmpDictionaryDid); 

      if (tmpDictionaryDid != null) 
      { 
       tmpDictionaryDid.TryGetValue("EDA0 1", out outStr); 
      } 
     } 

     Helper.logInWindow("Why U no work? " + outStr); 
     return outStr; 
    } 
Смежные вопросы