ArgumentOutOfRangeException我的C#代码出错

时间:2017-08-26 01:19:19

标签: c# indexoutofrangeexception

我现在正在学习C#,但仍然是初学者。

在练习创建方法时,我创建了这个方法,它产生了数值数组成员的总和(我的代码很大,而且我不擅长数学)。 VS返回ArgumentOutOfRangeException错误,但我不知道如何解决这个问题。 请救救我!

  public static int SumAll(int[] a)
    {
        List<int> sum = new List<int>();
        int sumAll;



        if (a.Length == 0)
        {
            sumAll = 0;
        }
        else
        {
            sum[0] = a[0];


            for (int i = 1; i < (a.Length - 1); i++)
            {
                sum[i] = sum[i - 1] + a[i];
            }

            sumAll = sum[a.Length - 1];
        }
        return sumAll;  
    }

2 个答案:

答案 0 :(得分:0)

使用 + = addition assignment operator

public static int SumAll(int[] a) 
{
  int sumAll = 0; 
  for (int i = 0; i < (a.Length - 1); i++) 
  { 
    sumAll += a[i]; 
  }
  return sumAll;
}

ArgumentOutOfRangeException通常与数组,集合或列表范围之外的项目有关。因为您使用List<int> sum而不是向其添加项目。 sum.Add(a[i]);这就是你得到例外的原因; sum变量没有任何项目。

答案 1 :(得分:0)

您获得该异常的原因是因为您尝试为List中的索引分配一个当前执行此操作时尚不存在的索引:

# your array
arr = [255, 216, 255, 224, 0, ...]
>>> bytearray(arr[:4])
bytearray(b'\xff\xd8\xff\xe0')

相反,您应该使用FF D8 FF E0方法将项​​目添加到列表中。添加后,您可以通过索引访问它们。这样做的原因是列表没有预先填充到任何设置大小(而数组是),所以首先f = open('/tmp/myimage.jpeg', 'wb') f.write(bytearray(arr)) f.close() 没有任何内容。

sum[0] = a[0];

你也会在这里得到这个例外:

.Add

这是因为[0]列表只包含sum.Add(a[0]); 项(您的循环在sumAll = sum[a.Length - 1]; 时停止)。这是您的代码中的错误!您应该使用sum作为条件:

a.Length - 2

这样您就可以遍历所有 i == a.Length - 1数组中的项目。

您的方法看起来像这样(注意我还添加了对i < a.Length的检查):

for (int i = 1; i < a.Length; i++)

现在,如果您愿意,可以简化此代码,方法是删除列表,从a开始,然后在循环中将a == null中的每个项目添加到其中:

public static int SumAll(int[] a)
{
    if (a == null) return 0;

    List<int> sum = new List<int>();
    int sumAll;

    if (a.Length == 0)
    {
        sumAll = 0;
    }
    else
    {
        sum.Add(a[0]);


        for (int i = 1; i < a.Length; i++)
        {
            sum.Add(sum[i - 1] + a[i]);
        }

        sumAll = sum[a.Length - 1];
    }

    return sumAll;
}

或者您可以使用sumAll = 0扩展方法a真正缩短它:

public static int SumAll(int[] a)
{
    if (a == null) return 0;

    int sumAll = 0;

    for (int i = 0; i < a.Length; i++)
    {
        sumAll += a[i];
    }

    return sumAll;
}