2011-08-20 3 views
1

이 작업을 수행하는 가장 최적의 방법을 알고 싶습니다. 기본적으로 나는 3 개의 데이터 그룹을 가지고있다. 각 그룹은 계층 구조의 다른 그룹 안에 있습니다. 이를 달성하기 위해 사전 내 사전을 사용하고 있습니다. 예제 코드 :사전 값에 사전의 올바른 방법?

Dictionary<string,Dictionary<string,List<string>>> pro = new Dictionary<string,Dictionary<string,List<string>>>(); 
     Dictionary<string,List<string>> part = new Dictionary<string,List<string>>(); 
     List<string> foo = new List<string>(); 
     List<string> bar = new List<string>(); 
     foo.Add("foo1"); 
     foo.Add("foo2"); 
     foo.Add("foo3"); 

     bar.Add("bar1"); 
     bar.Add("bar2"); 
     bar.Add("bar3"); 

     part.Add("Part1", foo); 
     part.Add("Part2", bar); 
     pro.Add("First", part); 

     foreach (var pros in pro) 
     { 
      foreach (var parts in pros.Value) 
      { 
       foreach (var foos in parts.Value) 
       { 
        Console.WriteLine(foos); 
       } 
      } 
     } 

내 코드가 작동하고 있어도 여전히 C#을 처음 접했지만 여전히 우아한 솔루션이 있다고 느낍니다. 미리 감사드립니다!

답변

1

구성 부분에 collection initializers을, 인쇄 부분에 LINQ을 사용할 수 있습니다.

Dictionary<string, Dictionary<string,List<string>>> pro = new Dictionary<string, Dictionary<string,List<string>>>() 
{ 
    { "First", new Dictionary<string,List<string>>() 
     { 
      { "Part1", new List<string>() { "foo1", "foo2", "foo3" } }, 
      { "Part2", new List<string>() { "bar1", "bar2", "bar3" } } 
     } 
    } 
}; 

EDIT : stackoverflow에 대한 또 다른 유용한 관련 게시물을 참조하여 LINQ에 대한 새 링크를 제공했습니다.

+0

나는 귀하의 솔루션을 좋아합니다. 그러나 "Part1"목록을 어떻게 얻을 수 있습니까? 전문가. [ "First"]. 트리플 엑스? 나는 분명히 자신을 설명하지 못해 죄송합니다. 목록은 목록 상자의 데이터 소스로 사용됩니다. –

+0

당신은 그 글자를 얻기 위해 프로 [ "First"] [ "Part1"]로 글을 쓸 것입니다. – mtijn

+0

정말 내가 원하는 해결책은 아니지만 해결책을 찾는데 도움이되었습니다. 감사! –

2

이런 종류의 코드를 사전의 간단한 래퍼 클래스로 리팩터링해야한다고 생각합니다. 이 방법은 거의 읽을 수 없지만 Parts/Pro 용 래퍼 클래스를 만들면 이름이 무엇이든 상관없이 코드를보고 독서하고 클래스 내부에 몇 가지 유틸리티 함수를 넣을 수 있으며 사전을 사용하여 세부 구현을 숨길 수 있습니다.

+0

나는 당신이 말하려고하는 것을 이해하지만, 나는 매우 제한된 경험을 가지고있다. 그래서 나는 클래스에서 반복 할 수 있을지 잘 모르겠습니다. –

+0

그래서 Pro의 래퍼 클래스를 만들고 Part의 내부 클래스를 만들까요? List 을 사용하여 데이터를 수집 하시겠습니까? –

+0

나는 내부 클래스가 맘에 들지 않는다. 그렇지만 가능할 수도있다. (나는 단지 * normal * 클래스를 만들 것이다.) 그리고 IEnumerable <...>을 구현하거나 IEnumerable 타입의 속성을 쓰는 것 (<...> ... = 열거하고 싶다) foreach (x는 클래스 인스턴스) 또는 foreach (x는 classinstance.property)를 사용할 수있다. – Carsten

관련 문제