如何将2D数组更改为2D列表,然后再将其更改为2D数组?

时间:2013-08-13 18:44:54

标签: c# arrays

我认为搜索SO会让我看到有关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
???

如何将b更改回2D数组?以上也是正确的吗?

2 个答案:

答案 0 :(得分:5)

这样的事情:

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

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

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

现在您已经定义了一个10x10阵列锯齿状阵列。

现在有点LINQ:

你想要一个清单:

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

你想要一个数组:

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

第二个是镜面反射。

现在......只是出于好奇,如果你有一个真正的多维数组?然后它很复杂,非常复杂。

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<List<int>>。 LINQ不容易做到这一点(除非你想使用你不应该使用的List<T>.ForEach(),因为它不是犹太人,然后List<T>.ForEach()不是LINQ)...但是使用两个嵌套的for ()

很容易实现