2013-08-18 2 views
-1

일반적인 다차원 배열이 있지만 각 하위 배열에 키와 같은 것을 추가해야합니다. json처럼.키가있는 다차원 배열

예 구조 :

{ 
    "0": 
    { 
     "1": 
     { 
      {1, 5, 9, 55} 
     }, 
     "5": 
     { 
      {97, 82, 5} 
     } 
    }, 
    "2": 
    { 
     "0": 
     { 
      {9} 
     }, 
     "2": 
     { 
      {3, 2, 2, 1, 4} 
     } 
    }, 
    "10": 
    { 
     "6": 
     { 
      {9, 10} 
     }, 
     "7": 
     { 
      {0, 8, 2} 
     } 
    } 
} 

내가 예를 들어 그것을 설명하려고합니다 :

variable[0] would be equal "0" 
variable[1] would be equal "2" 
variable[3] would be equal "10" 

variable[0][0] would be equal "1" 
variable[0][1] would be equal "5" 

variable[1][0] would be equal "0" 
variable[1][1] would be equal "2" 

variable[0][0][0] would be equal "1" 
variable[0][0][1] would be equal "5" 
variable[0][0][2] would be equal "9" 
variable[0][0][3] would be equal "55" 

variable[0][1][0] would be equal "97" 
variable[0][1][1] would be equal "82" 
variable[0][1][2] would be equal "5" 

내가 더 변수를 사용하여 그것을 할 수있을 것입니다하지만 난 꽤 많은 데이터가 미래에 변화 할 필요가있을 수 있으므로 위와 같이 구조화해야합니다. C#에서이 작업을 수행하는 가장 효율적인 솔루션은 무엇입니까?

나는 다차원 사전을 시도했지만 구문이 잘못되었습니다 :

Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>> scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>>() 
{ 
    { 
     0, 
     { 
      1, 
      { 
       1, 
       { 
        1, "test" 
       } 
      } 
     } 
    } 
}; 
textBox1.Text = scope[0][0][0][0]; 

이 문제가 있습니까?

그리고 하나 더 질문드립니다. 다음 대괄호를 사용하십시오. "()"이 (가) Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>> scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>>() 끝에 있습니까? 감사합니다. . 구문 문제 외에도

+0

_these brackets : "()"_는 선택 사항입니다. –

답변

1

나는 다차원 사전을 시도했지만 그 구문은 (같은 intstring)는 단순한 상수를 추가 할 수 있습니다 직접 초기화 구문에서

잘못된 것입니다. 당신은 새로운 객체 (사전)가 필요하므로이된다 : 여기 byte를 사용하여 아무 문제가없는

var scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>> 
{ 
    { 0, new Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>> 
      { 
      { 0, new Dictionary<byte, Dictionary<byte, string>> 
        ... 
      } 
      } 
    }, 
    { 1, new Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>> 
      { 
      ... 
      } 
    }, 

}; 
  • . 작은 숫자가 필요할 때는 항상 int을 사용하십시오.
+0

감사합니다. 바이트를 사용해서는 안되는 이유는 무엇입니까? 255를 초과하지 않습니다. – LukAss741

+0

'int'는 기본 (최적화 된) 타입입니다. 'byte' 나'short'를 사용하는 특별한 이유가 필요합니다. 여기서는 그렇지 않습니다. –

0

Henk Holterman 지적, 그렇게이 일의 핵심으로 하위 사전을 초기화 :

textBox1.Text = scope[0][0][0][0]; 

KeyNotFoundException을 던져 함께. 이 작업을해야합니다 :

textBox1.Text = scope[0][1][1][1]; 

그리고 그와 같은 이니셜 라이저를 사용하여 매개 변수없는 생성자를 호출 할 때 아니, 당신은 괄호가 필요하지 않습니다.

그러나, 나는 대신 Dictionary<Tuple<byte, byte, byte, byte>, string>를 사용하는 것이 좋습니다 것입니다, 그래서 당신은이 작업을 수행 할 수 있습니다

var scope = new Dictionary<Tuple<byte, byte, byte, byte>, string> 
{ 
    { 
     Tuple.Create<byte, byte, byte, byte>(0, 1, 1, 1), "test" 
    } 
}; 

textBox1.Text = scope[Tuple.Create<byte, byte, byte, byte>(0, 1, 1, 1)]; 

을 그리고 당신이 Dictionary<Tuple<int, int, int, int>, string>를 사용하는 경우 구문은 좀 더 우아한입니다 :

var scope = new Dictionary<Tuple<int, int, int, int>, string> 
{ 
    { 
     Tuple.Create(1, 1, 1), "test" 
    } 
}; 

textBox1.Text = scope[Tuple.Create(0, 1, 1, 1)]; 

또는 이를 래핑하여보다 편리한 인덱서를 제공하는 클래스를 직접 만들 수 있습니다.

하지만 임의의 키가 있으면 사전이 유용합니다. 키가 모두 0에서 N까지 다양하다는 것을 알고 있다면 간단한 string[][][]이 가장 쉬운 솔루션입니다.