2015-10-02 7 views
3

У меня есть многомерный массив, который мне нужно преобразовать в список массивов. Не один массив, но для каждой итерации первого измерения мне нужен отдельный массив, содержащий значения во втором измерении.Преобразование многомерного массива в список одного массива

Как преобразовать это:

int[,] dummyArray = new int[,] { {1,2,3}, {4,5,6}}; 

в list<int[]> проведение двух массивов со значениями {1,2,3} и {4,5,6}?

+2

Ключевое слово для этого - «сгладить» для поиска в Интернете. – BananaAcid

+1

@BananaAcid, но OP не хочу 'Список ' он хочет 'Список ' – Grundy

+0

@Grundy: правильно, но как «плоский» он должен быть - я считаю, пример кода можно отрегулировать. Подобно приведенному ниже примеру LINQ, он просто берет первый «уровень». – BananaAcid

ответ

4

Вы можете преобразовать массив 2d в jagged array, а затем convert it to List.

int[,] arr = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; 

int[][] jagged = new int[arr.GetLength(0)][]; 

for (int i = 0; i < arr.GetLength(0); i++) 
{ 
    jagged[i] = new int[arr.GetLength(1)]; 
    for (int j = 0; j < arr.GetLength(1); j++) 
    { 
     jagged[i][j] = arr[i, j]; 
    } 
} 

List<int[]> list = jagged.ToList(); 
+0

first working awnser thanks – martijn

4

Вы можете использовать Linq:

int[,] dummyArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; 
int count = 0; 
List<int[]> list = dummyArray.Cast<int>() 
        .GroupBy(x => count++/dummyArray.GetLength(1)) 
        .Select(g => g.ToArray()) 
        .ToList(); 
1

Вы можете использовать цикл как это:

 int[,] dummyArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; 

     int size1 = dummyArray.GetLength(1); 
     int size0 = dummyArray.GetLength(0); 

     List<int[]> list = new List<int[]>(); 

     for (int i = 0; i < size0; i++) 
     { 
      List<int> newList = new List<int>(); 

      for (int j = 0; j < size1; j++) 
      { 
       newList.Add(dummyArray[i, j]); 
      } 

      list.Add(newList.ToArray()); 
     } 
+0

Почему бы не использовать массив напрямую, вместо того, чтобы вызывать 'ToArray' в списке? вы уже знаете длину, которая не изменилась. – Grundy

0

Вот многоразовой реализация

public static class Utils 
{ 
    public static List<T[]> To1DArrayList<T>(this T[,] source) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     int rowCount = source.GetLength(0), colCount = source.GetLength(1); 
     var list = new List<T[]>(rowCount); 
     for (int row = 0; row < rowCount; row++) 
     { 
      var data = new T[colCount]; 
      for (int col = 0; col < data.Length; col++) 
       data[col] = source[row, col]; 
      list.Add(data); 
     } 
     return list; 
    } 
} 

и образец использования

var source = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; 
var result = source.To1DArrayList(); 

Некоторые комментарии к другим ответам.

M.kazem Akhgary: Если мне нужно список, я не понимаю, почему я должен сначала создать зазубренный массив и обращенного его в список вместо создания списка непосредственно.

Eser: Мне обычно нравятся его элегантные решения Linq, но это определенно не один из них. Если идея состоит в том, чтобы использовать Linq (хотя я твердо верю, что это не предназначено для этого), следующее будет более подходящим:

var source = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; 
var result = Enumerable.Range(0, source.GetLength(0)) 
    .Select(row => Enumerable.Range(0, source.GetLength(1)) 
    .Select(col => source[row, col]).ToArray()) 
    .ToList(); 
Смежные вопросы