2009-12-04 2 views
1

C#으로 어떻게 다차원 데이터 구조를 만들 수 있습니까? 내 마음에C#의 다차원 데이터 구조

는 그것과 같이 작동합니다

List<List<int>> results = new List<List<int>>(); 
    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      results[i][j] = 0; 
     } 
    } 

이 (그것이 ArgumentOutOfRangeException를 throw) 작동하지 않습니다. C#에서 인덱스를 통해 멤버에 액세스 할 수있는 다차원 구조가 있습니까?

+0

"작동하지 않는다"는 것이 무엇입니까? –

+0

아마도 "참조 된 요소가 없으므로 예외가 발생합니다." –

+0

그것은 충돌하고 그 범위 밖의 말합니다 –

답변

0

데이터 테이블을 사용하고 열과 행을 추가 할 수 있습니까? 그런 다음 이름이나 색인으로 참조 할 수 있습니다.

2

색인 생성을 시작하기 전에 목록을 만들고 0으로 초기화해야합니다.

List<List<int>> results = new List<List<int>>(); 

    for (int i = 0; i < 10; i++) 
    { 
     results.Add(new List<int>(Enumerable.Repeat(0, 10))); 
    } 
2

실제로는 1) 각각의 내부 목록을 만들고 2) 그 크기로 설정해야합니다.

var Results = Enumerable.Range(0, 10).Select(i => Enumerable.Repeat(0, 10).ToList()).ToList(); 

저는 약간의 Linq 중독자입니다.

+0

나도 역시 :-). 이것이 나의 선호하는 방법이기 때문에 나는 그것을 나의 대답에도 덧붙였다.모두가 계속 사용하는 'for'는 무엇입니까? : o) – Zooba

10

여기서 문제는 List이 요소를 자동으로 생성하지 않는다는 것입니다. List<List<T>>는이 같은 필요 초기화하려면 Capacity를 설정하는 것은 충분하지 않습니다 것을

List<List<int>> results = new List<List<int>>(); 

for (int i = 0; i < 10; i++) 
{ 
    results.Add(new List<int>()); 
    for (int j = 0; j < 10; j++) 
    { 
     results[i].Add(0); 
    } 
} 

주, 당신은 당신이 필요로하는 횟수 Add를 호출해야합니다. 양자 택일로, 당신은 Linq에의 Enumerable 클래스를 사용하여 일을 단순화 할 수 있습니다 : 그것은 동일한 목록 10 참조를 추가하기 때문에

List<List<int>> results = new List<List<int>>(); 

for (int i = 0; i < 10; i++) 
{ 
    results.Add(new List<int>()); 
    results[i].AddRange(Enumerable.Repeat(0, 10)); 
} 

다시, Enumerable.Repeat(new List<int>(), 10)이 작동하지 않습니다.

극단적 Linq에를 사용하는 또 다른 방법 :

List<List<int>> results = Enumerable.Repeat(0, 10) 
    .Select(i => Enumerable.Repeat(0, 10).ToList()) 
    .ToList(); 

마지막으로 (. 사용되지 않는 매개 변수 i는 상술 한 바와 같이, 같은 목록 10 번을 참조하지 않도록하는 것이 필요하다) 요소에 액세스하려면 이전에 사용한 표기법을 정확하게 사용할 수 있습니다. 요소가 추가되면 같이, 그들은 읽거나 수정할 수 있습니다

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     results[i][j] = 2; 
     int x = results[i][j]; 
    } 
} 
+0

동적 인 구조체가 필요합니다. 사전에 시간을 초기화하지 않으면 ... –

+0

액세스하기 전에 이미 충분한 요소가 있는지 확인하기 위해 코드를 포함 시키거나'Dictionary >. – Zooba

3

당신이 사전에 구조의 크기를 알고 있다면, 당신은 추가 또는 요소, 다음 2 차원 배열의 소리를 제거 할 계획이없는 당신의 물건처럼 :

int[,] n = new int[10, 20]; 
for (int i = 0; i < 10; ++i) { 
    for (int j = 0; j < 10; ++j) { 
     n[i, j] = ... 
    }; 
};