2013-12-19 5 views
0

Я пытаюсь заполнить словарь словарей словарей. Однако, когда я пытаюсь заполнить третий словарь, я получаю следующую ошибку ниже. Как бы я заполнил свой второй словарь, не получив ошибку?Как заполнить словарь словарей словарей?

The best overloaded method match for 'System.Collections.Generic.Dictionary<string,System.Collections.Generic.Dictionary<string, 
System.Collections.Generic.List<string>>>.this[string]' has some invalid arguments 


//code 

ClientsData.Add(new MapModel.ClientInfo { Id = IDCounter, Doctors = new Dictionary<string, Dictionary<string,List<string>>>() }); 

ClientsData[0].Doctors.Add(Reader["DocID"].ToString(), new Dictionary<string,List<string>>()); 

ClientsData[0].Doctors[0].Add("Name", new List<string>(){ Reader["DocName"].ToString()});//Error occurs here 
+3

Я собираюсь бросить это там: это гигантский код запах. Я бы сказал, большие проблемы с дизайном. –

+0

Вы бы намного лучше создали пользовательскую 'struct ComplexKey', которая делает необходимую мануальность кода равенства/хэша, чтобы действовать как ключ для словаря * one *. –

ответ

1

Чтобы получить доступ к словарю, как, что вам нужно использовать ключ, который в вашем случае является строкой:

ClientsData[0].Doctors[Reader["DocID"].ToString()].Add("Name", new List<string>(){ Reader["DocName"].ToString()}); 
+0

Тем не менее, я согласен с комментарием @ Simon, вы можете пересмотреть свой дизайн здесь ... – Alden

1

Если вы хотите использовать тройные dictonaries вы можете использовать следующий фрагмент код:

var dict = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>(); 

dict["level-one"] = new Dictionary<string, Dictionary<string, string>>(); 
dict["level-one"]["level-two"] = new Dictionary<string, string>(); 
dict["level-one"]["level-two"]["level-three"] = "hello"; 

Console.WriteLine(dict["level-one"]["level-two"]["level-three"]); 

Или вы можете сделать свой собственный обертку, как это:

public class TrippleDictionary<TKey, TValue> 
{ 
    Dictionary<TKey, Dictionary<TKey, Dictionary<TKey, TValue>>> dict = new Dictionary<TKey, Dictionary<TKey, Dictionary<TKey, TValue>>>(); 

    public TValue this [TKey key1, TKey key2, TKey key3] 
    { 
     get 
     { 
      CheckKeys(key1, key2, key3); 
      return dict[key1][key2][key3]; 
     } 
     set 
     { 
      CheckKeys(key1, key2, key3); 
      dict[key1][key2][key3] = value; 
     } 
    } 

    void CheckKeys(TKey key1, TKey key2, TKey key3) 
    { 
     if (!dict.ContainsKey(key1)) 
      dict[key1] = new Dictionary<TKey, Dictionary<TKey, TValue>>(); 

     if (!dict[key1].ContainsKey(key2)) 
      dict[key1][key2] = new Dictionary<TKey, TValue>(); 

     if (!dict[key1][key2].ContainsKey(key3)) 
      dict[key1][key2][key3] = default(TValue); 
    } 
}  

И использовать его как это:

var tripple = new TrippleDictionary<string, string>(); 
tripple["1", "2", "3"] = "Hello!"; 

Console.WriteLine(tripple["1", "2", "3"]); 

См Demo

+0

'ContainsKey' непрямой. Используйте «TryGetValue» и «Add» для объединения значений. –

Смежные вопросы