在C#中对锯齿状的int数组求和

时间:2016-07-13 07:20:13

标签: c# jagged-arrays

正如在此处所做的那样:{{3}},但这次是锯齿状数组。获得:

  

System.IndexOutOfRangeException。

我是初学者,寻求帮助。这是我的代码:

Project.json

2 个答案:

答案 0 :(得分:2)

在你的内循环中这样做:

for (int i = 0; i < arr.Length; i++)
{
    if (arr[i] != null)
    {
        for (int j = 0; j < arr[i].Length; j++) 
        { 
            total += arr[i][j];
        }  
    }
} 
return total; 

因为您的列表甚至不是arr.GetLength(1)的第一个维度的例外 - 它在该地方没有项目。

在数组看起来像这样的情况下需要if (arr[i] != null)行:

 int[][] arr = new int[][] 
 {
      new int [] {1},
      null,
      new int [] {1,3,-5},
 };

在这种情况下,当我们使用i==1循环并尝试arr[i].Length(意为arr[1].Length时,我们会收到NullReferenceException

在完成基础知识并到达Linq之后,所有当前的Sum方法都可以替换为:

arr.SelectMany(item => item).Sum()

但从基础知识开始是好的:)

答案 1 :(得分:2)

由于您使用的是锯齿状阵列,因此该阵列的尺寸不一定均匀。看看那个锯齿状数组的初始化代码:

int[][] arr = new int[][] {
    new int [] {1},
    new int [] {1,3,-5},
};

因此,在第一维中,有两个元素({1}{1, 3, -5})。但第二个维度不是相同的长度。第一个元素只有一个元素({1})而第二个元素有3个元素({1, 3, -5})。 这就是您面对IndexOutOfRangeException

的原因

要解决这个问题,您必须将内循环调整为该维度的元素数量。你可以这样做:

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