2013-08-13 4 views
0

나는 SO 검색에서 2D 배열에 관한 히트를 2D 배열에 표시 할 것이라고 생각했지만 생각했던 것만 큼 일반적인 것 같지 않습니다.어떻게 2D 배열을 2D 목록으로 변경 한 다음 2D 배열로 다시 변경할 수 있습니까?

이 내가있어 무엇 :

// init array 
int[][] a = new int[10][10]; 

// change 2D array to 2D list 
List<List<int>> b = a.Cast<List<int>>().ToList(); 

// change 2D list back to 2D array 
??? 

가 어떻게 2 차원 배열로 다시 ㄱ 변경할 수 있습니까? 위의 내용도 맞습니까? 이 같은

답변

5

뭔가 :

List<List<int>> lists = arrays.Select(inner=>inner.ToList()).ToList(); 

int[][] arrays = lists.Select(inner=>inner.ToArray()).ToArray(); 
1

그것은 완전히 잘못이다. 그런 식으로 b을 얻을 수 없습니다. 그리고 심지어 초기화가 잘못되었습니다. .NET에는 두 가지 유형의 다차원 배열이 있습니다. 진정한 다차원 배열과 가변 배열 ...

시작 ... 귀찮은 배열을 사용하고 있습니다. 차이는

int[][] a = new int[10][]; // see how you define it? 
// Only the first dimension can be is sized here. 

for (int i = 0; i < a.Length; i++) 
{ 
    // For each element, create a subarray 
    // (each element is a row in a 2d array, so this is a row of 10 columns) 
    a[i] = new int[10]; 
} 

이제 10 × 10 배열 가변 배열을 정의), 당신은 ... 그것을 요구하지 않았다 당신이 그들을 필요로하는 경우, 그것을 구글.

이제 조금 LINQ :

int[][] c = b.Select(row => row.ToArray()).ToArray(); 

첫 번째 표현은

foreach element of a, we call this element row `a.Select(row =>` <br> 
make of this element a List `row.ToList()` and return it<br> 
of all the results of all the elements of a, make a List `.ToList();` 

을 의미한다 : 당신이 다시 배열을 원하는

List<List<int>> b = a.Select(row => row.ToList()).ToList(); 

:

당신은 목록을 원하는 두 번째는 반사입니다.

지금 ... 호기심에서 벗어나 진정한 다차원 배열이 있다면? 그때 그것은 매우 복잡했습니다. 우리가 List<List<int>>에 다차원 배열을 "변환"할 수있는 까다로운 (끔찍한) LINQ 식

int[,] a = new int[10,10]; 

int l0 = a.GetLength(0); 
int l1 = a.GetLength(1); 

var b = new List<List<int>>(
       Enumerable.Range(0, l0) 
         .Select(p => new List<int>(
              Enumerable.Range(0, l1) 
                .Select(q => a[p, q])))); 

var c = new int[b.Count, b[0].Count]; 

for (int i = 0; i < b.Count; i++) 
{ 
    for (int j = 0; j < b[i].Count; j++) 
    { 
     c[i, j] = b[i][j]; 
    } 
} 

. 도로 뒷쪽은 LINQ로 쉽게 수행 할 수 없습니다 (List<T>.ForEach()을 사용하지 않으려면 사용하지 않아야합니다. 더 정교하지 않고 List<T>.ForEach()이 LINQ가 아니기 때문에) ... 그러나 두 개의 중첩 된 for()으로 쉽게 수행 할 수 있습니다.