将多维数组转换为单个数组的列表

时间:2015-10-02 07:21:37

标签: c#

我有一个多维数组,我需要转换为数组列表。不是单个数组,但是对于第一个维度的每次迭代,我需要一个包含第二维中的值的单独数组。

我如何转换它:

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

进入list<int[]>,其中包含两个值为{1,2,3}{4,5,6}的数组?

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();

答案 2 :(得分:1)

你可以像这样使用for循环:

        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());
        }

答案 3 :(得分: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();