0

次のような配列の配列を作成しています。

var arrNewArray = new string[arrOldArray.Length][7];

arrOldArray は、[X][4] のような配列の配列です。つまり、最初の配列または「外側」の配列の長さは変更できますが、「内側」の配列の長さは常に 4、または 4 つの文字列を保持します ([ 0][1][2][3])。

コンパイラが上記のステートメントを受け入れないのはなぜですか?

基本的に、arrOldArray を取得して展開するか、古い配列の [4] を新しい配列の [7] に増やして「列」をいくつか追加し、内容をコピーしようとしています。おそらく私はそれを最善/効率的な方法で行っているわけではないので、ガイダンスをいただければ幸いです。

4

6 に答える 6

4

2次元配列が必要だと思います:

var arrNewArray = new string[arrOldArray.Length, 7];

次のようにアクセスしますarrNewArray[x, y]

これは、「列」の数がすべての行で同じであることを明確に伝えるため、ジャグ配列よりも優れています。

引き続きジャグ配列を使用する場合は、次のようにする必要があります。

var arrNewArray = new string[arrOldArray.Length][];
for(int i = 0; i < arrOldArray.Length; ++i)
    arrNewArray[i] = new string[7];

この複雑な方法の理由は次のとおりです。ジャグ配列では、各「行」が異なる数の「列」を持つことができます。各「行」に同じ数の「列」がある場合の簡略構文は存在しません。これが、コードがコンパイルされない理由です。
ジャグ配列は配列の配列に不可欠であるため、外側の配列の「行」ごとに新しい配列インスタンスを作成し、明示的に割り当てる必要があります。それがforループがしていることです。

Array.Copyジャグ配列では使用できません。各子配列は独自のインスタンスでありArray.Copy、ディープ コピーを作成しません。ある配列から別の配列への参照をコピーするだけです。その結果、両方の配列が同じアイテムを指し、一方の配列のアイテムを変更すると、もう一方の配列から見えるようになります。

于 2013-01-24T16:57:52.080 に答える
2

ジャグ配列を正しく作成していません。適切な方法は、ジャグ配列の最初の次元を作成してから、最初の次元の項目をループ処理してネストされた配列を作成し、古い配列からデータをコピーすることです。次に例を示します。

int newSize = 7;
string[][] newArray = new string[oldArray.Length][];
for (int i = 0; i < oldArray.Length; i++)
{
    newArray[i] = new string[newSize];
    Array.Copy(oldArray[i], newArray[i], oldArray[i].Length);
}
于 2013-01-24T17:25:18.763 に答える
1

あなたは望んでいるでしょう

var arrNewArray = new string[arrOldArray.Length, 7];
于 2013-01-24T16:57:34.577 に答える
0

Linq の使用:

int[][] jaggedArray2 = new int[][] 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};
int length = jaggedArray.Sum(a => a.Length);
于 2013-01-24T17:08:15.090 に答える
0

あなたが求めていることが直接可能だとは思いません。使用している構文はジャグ配列用であり、多次元配列を作成するように効果的に要求しているためです。

あなたが本当に欲しいのは多次元配列であるように見えるので、構文は紛らわしいです(ただし、そうではないことは承知しています)。

サイズが変更されたため、新しく割り当てられた配列に配列を格納できるとは思いません。データをより大きな配列に移動するには、カスタム コピー メソッドを作成する必要があります。

于 2013-01-24T17:29:43.950 に答える