2010-01-01 3 views
1

Я создал сложный словарь.Комплексный словарь Печать

mainDict<mainKey, SubDict> 
subDict<subKey, sub1Dict> 
sub1Dict<sub1Key, sub2Dict> 
sub2Dict<sub2Key, sub2Value> 
....... 

Как напечатать ее, как это (VS2005 & .net 2.0 на основе)

mainKey/subKey/sub1Key/sub2Key, sub2Value 

ли мне нужно преобразовать mainDict в список и вызвать присоединиться()?

спасибо.

+3

Привет, имхо хорошая идея, чтобы выявить основные типы и области действия класса модификаторов (статические и т.д.) вам используют «фронт» в вашем исходном вопросе на очень странном и сложном примере вроде этого: только на вашем втором. комментируя ответ Дарина ниже, вы, наконец, говорите нам, что «mainDict: статический словарь <строка, объект>». Мы ничего не знаем о типах различных под-ключей, суб-словарей или типа sub2Value: мы не знаем, подкатегория sub2Dict от sub1Dict и т. Д. Мои «психические» полномочия тусклые :) – BillW

+0

Хорошо. Я также согласен с тем, что мой оригинальный пост не ясен. вы, ребята, уже много помогли мне. Я воспользовался вашими ответами. - благодаря. –

ответ

3
StringBuilder sb = new StringBuilder(); 
foreach (KeyValuePair<mainKey, SubDict> pair1 in mainDict) 
foreach (KeyValuePair<subKey, sub1Dict> pair2 in pair1.Value) 
foreach (KeyValuePair<sub1Key, sub2Dict> pair3 in pair2.Value) 
foreach (KeyValuePair<sub2Key, sub2Value> pair4 in pair3.Value) 
{ 
    sb.AppendFormat("{0}/{1}/{2}/{3}, {4}", 
     pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair4.Value); 
} 

UPDATE:

StringBuilder sb = new StringBuilder(); 
foreach (KeyValuePair<string, object> pair1 in mainDict) 
foreach (KeyValuePair<string, object> pair2 in (Dictionary<string, object>)pair1.Value) 
foreach (KeyValuePair<string, object> pair3 in (Dictionary<string, object>)pair2.Value) 
foreach (KeyValuePair<string, object> pair4 in (Dictionary<string, object>)pair3.Value) 
{ 
    sb.AppendFormat("{0}/{1}/{2}/{3}, {4}", 
     pair1.Key, pair2.Key, pair3.Key, pair4.Key, pair4.Value); 
} 
+0

Привет, Darin, Acturally, mainDict, сгенерированный из результата синтаксического анализа файла XSD. В мой код не может быть добавлено ключевое слово. Я объявил mainDict как статический словарь . Я боюсь, что я не могу предложить (KeyWord Content) в качестве вашего предложения. как расширить метод цикла StringBuilder для удовлетворения моих требований? Спасибо. –

+0

Посмотрите, помогает ли обновление. –

+0

sb.AppendFormat ("{0}/{1}/{2}/{3}, {4}", - Невозможно использовать фиксированные 4 переменные. Номер позиции будет изменен динамически на основе слоев mainDic. означает, что mainDict сгенерирован динамически, и если файл XSD изменяется, mainDic тоже должен измениться. Верхний код все же может передать динамическое условие. –

2

Невозможно увидеть что-либо гораздо лучше, чем вложенные циклы для этого - перебирать ключи mainDict, затем ключи subDict внутри и т. Д. Затем вы можете отобразить переменные цикла и самое внутреннее значение в виде строки.

2

Вы можете использовать LINQ:

var qry = from pair1 in mainDict 
      from pair2 in pair1.Value 
      from pair3 in pair2.Value 
      from pair4 in pair3.Value 
      select pair1.Key + "/" + pair2.Key + "/" + pair3.Key 
        + "/" + pair4.Key + ", " + pair4.Value; 

foreach(var s in qry) Console.WriteLine(s); 
+0

Привет, Marc, vs2005 & .net 2.0, используемый в моем проекте. Боюсь, я не могу использовать технологию LINQ. –

+4

Затем я вижу много вложенных циклов в будущем ... –

+1

Для получения информации, если у вас был VS2008, вы все равно можете использовать LINQ-to-Objects с .NET 2.0 через LINQBridge: http://www.albahari.com/nutshell /linqbridge.aspx –

0

Я закончил тем, что писал один попробовав несколько минут, чтобы найти один здесь. Здесь мы идем:

 //--------------------------------------------------- 
     // Get a nested Dictionary, then... 
     Console.WriteLine(DictionaryPrint(nestedDictionary)); 
     //--------------------------------------------------- 

     private static string DictionaryPrint(Dictionary<object,object> dictionary, string space = "") 
     { 
      string output = ""; 
      foreach(KeyValuePair<object,object> entry in dictionary) 
      { 
       output += space + entry.Key + ": "; 
       if (entry.Value is Dictionary<object, object>) 
        output += "\n" + DictionaryPrint((Dictionary<object, object>)entry.Value, space + " "); 
       else if (entry.Value is List<object>) 
        output += "\n" + ListPrint((List<object>)entry.Value, space + " "); 
       else 
        output += entry.Value + "\n"; 
      } 
      return output; 
     } 

     private static string ListPrint(List<object> list, string space = "") 
     { 
      string output = ""; 
      foreach (object entry in list) 
      { 
       if (entry is List<object>) 
        output += ListPrint((List<object>)entry, space + " "); 
       else if (entry is Dictionary<object, object>) 
        output += DictionaryPrint((Dictionary<object, object>)entry, space + " "); 
       else 
        output += entry + "\n"; 
      } 
      return output; 
     } 
0

Если вам случится быть с помощью JSON, вы могли бы сделать хуже, чем

JsonConvert.SerializeObject(yourDict, Formatting.Indented); 
Смежные вопросы