0

我想创建一个特定类型的锯齿状数组,然后根据数组中两个项目之间的比较创建另一个数组。

例如:

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 不存在,则跳过该比较。还是有更好的方法来做到这一点?

编辑

通过比较,我的意思是我想访问数组中在列中彼此接连出现的两个项目,对它们做一些事情并从产品中创建一个新数组(具有相同结构)的条目。

4

2 回答 2

3

首先,这里不需要GetUpperBound()。这对多维数组(或非基于 0 的数组)很有用,而不是锯齿状数组。相反,您可以使用Length - 1.

其次,您需要创建要分配的数组。new int[count][]不会创建嵌套数组,因此您的代码会抛出NullReferenceException.

第三,您希望将索引(和创建的数组的大小)限制为两个大小中的较小者。你可以使用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];
    }
}

第四,作为替代方案,您可以使用 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

您不是在比较,而是在添加。所以不清楚你真正想要做什么。

如果要对连续两行中的对应项执行操作,则只能对两行的最小长度执行此操作

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 回答