如何比较锯齿状阵列中的项目?

时间:2012-08-12 15:47:27

标签: c# jagged-arrays

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

例如:

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 个答案:

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

答案 1 :(得分:2)

首先,您不需要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();
}