0

SO を検索すると、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
???

b を 2D 配列に戻すにはどうすればよいですか? また、上記は正しいですか?

4

2 に答える 2

5

このようなもの:

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

int[][] arrays = lists.Select(inner=>inner.ToArray()).ToArray();
于 2013-08-13T18:47:42.040 に答える
1

それは完全に間違っています。あなたはbそのように入ることはできません。そして、初期化さえ間違っています。.NET には 2 種類の多次元配列があります... 真の多次元配列とジャグ配列です...

始めましょう...あなたはギザギザの配列を使用しています(それが何であるか、または違いを教えません。あなたはそれを求めていません...それらが必要な場合は、グーグルで検索してください)

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

2 つ目はスペキュラーです。

さて...好奇心から、もしあなたが真の多次元配列を持っていたら? それは複雑で、非常に複雑でした。

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>>. List<T>.ForEach()LINQ では簡単に戻ることはできません (コーシャではなく、LINQ ではないため、使用してはならないを使用したい場合を除きますList<T>.ForEach())...しかし、ネストされた 2 つのfor ()

于 2013-08-13T18:59:47.333 に答える