2010-01-01 2 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

안녕, 좋은 아이디어는 기본 타입과 클래스 범위 수정 (정적 등)을 공개 이럴을 아주 이상하고 복잡한 예제에서 원래의 질문에 "up front"을 사용하고 있습니다. 아래의 Darin의 대답에 대한 의견은 마침내 'mainDict is :'static dictionary '라고 말합니다. 우리는 다양한 하위 키, 하위 사전 또는 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)를 foreach 할 수는 없다. 내 요구 사항을 충족하는 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을 사용했다면 LINQBridge를 통해 .NET 2.0에서 LINQ-to-Objects를 계속 사용할 수 있습니다. 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);