0

特定のタイプのジャグ配列を作成し、その配列内の 2 つの項目の比較に基づいて、そこから別の配列を作成したいと考えています。

例えば:

int[][] arr = new int[][] 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22},
    new int[] {0,2,4,6}
};

int[][] arrResult = new int[arr.GetUpperBound(0)][]; 

for (int i = 0; i < arr.GetUpperBound(0); i++)
{
    for (int j = 0; j < arr[i].Length; j++)
    {
        arrResult[i][j] = arr[i][j] + arr[i + 1][j];
    }
}

i+1 が存在しない場合、その比較をスキップすると言う方法がわかりません。または、これを行うより良い方法はありますか?

編集

比較すると、列に並んでいる配列から 2 つの項目にアクセスし、それらを使って何かを行い、製品から新しい配列 (同じ構造を持つ) にエントリを作成したいということです。

4

2 に答える 2

3

まず、ここは必要ありませんGetUpperBound()。これは、ジャグ配列ではなく、多次元配列 (または非 0 ベースの配列) に役立ちます。代わりに、 を使用できますLength - 1

次に、割り当て先の配列を作成する必要があります。new int[count][]ネストされた配列を作成しないため、コードはNullReferenceException.

第 3 に、インデックス (および作成される配列のサイズ) を 2 つのサイズのうち小さい方で制限します。そのために使えますMath.Min()

まとめる:

int[][] arrResult = new int[arr.Length - 1][]; 

for (int i = 0; i < arr.Length - 1; i++)
{
    int length = Math.Min(arr[i].Length, arr[i+1].Length);
    arrResult[i] = new int[length];

    for (int j = 0; j < length; j++)
    {
        arrResult[i][j] = arr[i][j] + arr[i + 1][j];
    }
}

第 4 に、代わりに LINQ を使用できますZip()(短い配列によって結果のサイズを制限します)。

int[][] arrResult = new int[arr.Length - 1][]; 

for (int i = 0; i < arr.Length - 1; i++)
{
    arrResult[i] = arr[i].Zip(arr[i+1], (a, b) => a + b).ToArray();
}
于 2012-08-12T16:45:46.697 に答える
2

比較するのではなく、追加します。そのため、自分が本当にやりたいことは明確ではありません。

2 つの連続する行の対応するアイテムに対して操作を実行する場合は、2 つの行の最小の長さに対してのみ実行できます。

for (int i = 0; i < arr.Length - 1); i++) {
    for (int j = 0; j < arr[i].Length && j < arr[i + 1].Length; j++) {
        arrResult[i][j] = arr[i][j] + arr[i + 1][j];
    } 
} 
于 2012-08-12T16:16:08.453 に答える