【问题标题】:Index out of bounds error c#索引越界错误c#
【发布时间】:2015-01-10 02:24:17
【问题描述】:

使用我的数字返回因子函数,我得到了一个我不应该出现的错误。

这是我的代码:

static void Main(string[] args)
    {
        foreach (int element in Factors(16))
        {
            Console.Write(element.ToString() + ", ");
        }
    }
    static Array Factors(double value)
    {
        int[] factors = new int[] { };
        int counter = 0;

        for (int i = 1; i <= value; i++)
        {
            if (value % i == 0)
            {
                factors[counter] = i;
                counter++;
            }
        }
        return factors;
    }

这是我得到的错误:

TestSolver.exe 中出现“System.IndexOutOfRangeException”类型的未处理异常

附加信息:索引超出了数组的范围。

【问题讨论】:

  • 你没有为因子分配任何空间.....
  • factors 是一个空数组。里面有什么可以索引的?

标签: c# indexing indexoutofboundsexception


【解决方案1】:

您正在初始化一个空数组,但随后尝试将值分配给不存在的索引。对于此应用程序,List&lt;int&gt; 可能会更好地为您服务。

    var factors = new List<int>();
    for (int i = 1; i <= (0.5 * value); i++)
        if (value % i == 0)
            factors.Add(i);
    return factors.ToArray(); // returns int[]

【讨论】:

  • 谢谢,现在我对数组有了更多的了解,这更有意义
【解决方案2】:

线

int[] factors = new int[] { };

创建一个包含 0 个元素的数组。 .NET 中的数组是固定大小的,所以稍后当您尝试使用 factors[counter] = i; 访问元素时,它会失败,因为没有分配任何元素。

您需要在分配factors(类似于int[] factors = new int[16];)时指定元素的数量,或者使用动态数组List&lt;int&gt;(您可以使用Add()在末尾添加新元素) .

【讨论】:

    【解决方案3】:

    如果您真的不想更改大部分代码,您可以采取的另一种方法是为数组分配一个初始大小(例如,它可以拥有的最大数量),然后再调整大小。

        static void Main(string[] args)
        {
            foreach (int element in Factors(16))
            {
                Console.Write(element.ToString() + ", ");
            }
        }
        static Array Factors(double value)
        {
            int[] factors = new int[Convert.ToInt32(Math.Round(value,0))];
            int counter = 0;
    
            for (int i = 1; i <= value; i++)
            {
                if (value % i == 0)
                {
                    factors[counter] = i;
                    counter++;
                }
            }
            Array.Resize(ref factors, counter);
            return factors;
        }
    

    【讨论】:

      【解决方案4】:
      int[] factors = new int[] { };
      

      正在创建一个没有元素的数组(零大小)。当你这样做时,它不会神奇地扩展:

      factors[0] = 42;
      

      要调整数组大小,您可以使用Array.Resize(ref arrName, newSize) 或选择一个可以调整大小的集合,例如List&lt;int&gt;

      【讨论】:

      • ArrayList 而不是List&lt;T&gt;?为什么?!?
      • @Tim,“例如”,表示示例。 但是,由于很多人更喜欢泛型类,所以我会更改以适应。
      【解决方案5】:

      您没有设置数组的大小,这会导致错误。作为一种解决方法,您可以将其放在列表中并迭代您传递的参数。你可以试试这样的。

       static Array Factors(double value)
          {
              List<int> factors = new List<int>();
      
              for (int i = 1; i <= value; i++)
              {
                  if (value % i == 0)
                      factors.Add(i);            
              }
              return factors.ToArray();
          }
      

      【讨论】:

      • 除非有特定原因 OP 需要一个数组,否则我看不到 ToArray() 的值。
      • 我只是使用了他的代码中给出的内容。我们也可以将其设置为静态 List Factors(double value)...
      【解决方案6】:

      问题是这一行:

      int[] factors = new int[] { };
      

      您正在创建一个名为factors 的新整数数组,但您没有指定该数组必须包含多少元素。以这种方式初始化数组时,必须使用长度声明数组。因此当你写...

      factors[counter] = i;
      

      ...由于数组长度为 0 引发异常。它不能包含任何元素。 factors[0] = i 不是有效分配,因为 factors[0] 不存在。

      您可以轻松地使用List&lt;int&gt; 而不是数组来完成此操作。可以根据需要将元素添加到列表中。完成列表后,您可以使用ToArray 将其转换为数组。因此你可以修改Factors如下:

      static Array Factors(double value)
      {
          List<int> factors = new List<int>();
      
          for (int i = 1; i <= (0.5 * value); i++)
          {
              if (value % 1 == 0)
              {
                  factors.Add(i);
              }
          }
          return factors.ToArray();
      }
      

      请注意,不再需要 counter

      【讨论】:

      • 你的代码还是会报错。List factor = new List{};应该是 List();
      • 或者,您可以跳过 ToArray 并简单地返回 List&lt;T&gt; 并遍历它。
      • @Tim:当然,但原来的方法使用了int[],所以我不认为这是一个错误。
      猜你喜欢
      • 2016-08-26
      • 2014-06-06
      • 2015-03-22
      • 2013-10-13
      • 2014-01-27
      • 1970-01-01
      • 2017-03-23
      相关资源
      最近更新 更多