索引越界错误c#

时间:2014-11-13 02:40:41

标签: c# indexing indexoutofboundsexception

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

这是我的代码:

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

这是我得到的错误:

未处理的类型&#39; System.IndexOutOfRangeException&#39;发生在TestSolver.exe

其他信息:索引超出了数组的范围。

6 个答案:

答案 0 :(得分:0)

该行

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

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

您需要在分配factors(类似int[] factors = new int[16];)时指定元素数量,或使用动态数组List<int>(您可以使用Add()最后添加新元素。)

答案 1 :(得分:0)

您正在初始化一个空数组,但之后尝试将值分配给不存在的索引。对于此应用程序,使用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[]

答案 2 :(得分:0)

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

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

factors[0] = 42;

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

答案 3 :(得分:0)

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

    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 :(得分:-1)

问题是这一行:

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

答案 5 :(得分:-1)

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

 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();
    }
相关问题