索引越界错误 c#

本文关键字:错误 越界 索引 | 更新日期: 2023-09-27 18:30:21

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

这是我的代码:

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 中发生了类型为"System.IndexOutOfRangeException"的未处理异常.exe

其他信息:索引超出数组边界。

索引越界错误 c#

您正在初始化一个空数组,但随后尝试将值分配给不存在的索引。对于此应用程序,您可能最好使用List<int>

    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[]

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

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

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

如果您真的不想更改太多代码,可以采取的另一种途径是为数组分配初始大小(例如,它可以具有的最大数量),然后调整大小。

    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;
    }
int[] factors = new int[] { };

正在创建一个没有元素的数组(零大小)。当您执行以下操作时,它不会神奇地扩展:

factors[0] = 42;

要调整数组大小,您可以使用Array.Resize(ref arrName, newSize)或选择可以调整大小的集合,例如 List<int>

您尚未设置数组的大小,这会导致错误。作为解决方法,您可以做的是将其放在列表中并迭代要传递的参数。你可以试试这样的事情。

 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();
    }

问题是这一行:

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

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

factors[counter] = i;

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

您可以轻松地使用 List<int> 而不是数组来完成此操作。可以根据需要将元素添加到列表中。完成列表后,您可以使用 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