我想创建一个特定类型的锯齿状数组,然后根据数组中两个项目之间的比较创建另一个数组。
例如:
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不存在,那就跳过那个比较。或者有更好的方法吗?
修改
通过比较,我的意思是我想从数组中访问列中的两个项目,使用它们执行某些操作,并从产品中创建一个新数组(具有相同结构)的条目。
答案 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();
}