索引越界错误c#

索引越界错误c#,c#,indexing,indexoutofboundsexception,C#,Indexing,Indexoutofboundsexception,用一个数的返回因子的函数,我得到了一个我不应该得到的错误 这是我的代码: static void Main(string[] args) { foreach (int element in Factors(16)) { Console.Write(element.ToString() + ", "); } } static Array Factors(double value) {

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

这是我的代码:

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;
    }
static void Main(字符串[]args)
{
foreach(系数(16)中的int元素)
{
Write(element.ToString()+“,”);
}
}
静态数组因子(双值)
{
int[]因子=新的int[]{};
int计数器=0;
对于(inti=1;i

int[] factors = new int[] { };
创建一个包含0个元素的数组。NET中的数组大小是固定的,因此稍后当您尝试访问
因子[counter]=i;
的元素时,由于未分配任何元素,因此将失败


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

问题是这一行:

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

factors[counter] = i;
…由于数组长度为0,因此引发异常。它不能包含任何元素。
因子[0]=i
不是有效的赋值,因为
因子[0]
不存在

您可以轻松地使用
列表
而不是数组来完成此操作。可以根据需要将元素添加到列表中。处理完列表后,您可以使用
ToArray
将其转换为数组。因此,您可以修改
因子
,如下所示:

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();
}
静态数组因子(双值)
{
列表因子=新列表();

对于(int i=1;i您正在初始化一个空数组,但随后尝试将值分配给不存在的索引。对于此应用程序,您最好使用
列表

var factors=新列表();
对于(int i=1;i
正在创建一个没有元素的数组(零大小)。执行以下操作时,它不会神奇地展开:

factors[0] = 42;

要调整数组大小,可以使用
Array.resize(ref arrName,newSize)
或选择一个可以调整大小的集合,例如
列表

您尚未设置数组的大小,这会导致错误。作为一种解决方法,您可以将其放在列表中,并迭代正在传递的参数。您可以尝试类似的操作

 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 i=1;i如果您真的不想对代码进行太多更改,那么可以采取的另一种方法是为数组指定一个初始大小(例如,它可以拥有的最大数量),然后调整大小

    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;
    }
static void Main(字符串[]args)
{
foreach(系数(16)中的int元素)
{
Write(element.ToString()+“,”);
}
}
静态数组因子(双值)
{
int[]factors=newint[Convert.ToInt32(Math.Round(value,0));
int计数器=0;

对于(int i=1;i)您没有为因子分配任何空间….
因子
是一个空数组。其中有什么索引?谢谢,现在我对数组
ArrayList
而不是
列表
有了更多的了解,这就更有意义了?为什么?!@Tim,“比如”,意思是一个例子。但是,由于很多人喜欢泛型类,我会改变以适应。除非有特殊原因OP需要数组,否则我看不到
ToArray()
的值。我只是使用了他的代码中给出的值。我们还可以将其设置为静态列表因子(双值)…您的代码仍然会抛出错误。..List factors=new List{};应该是List();或者,您可以跳过
ToArray
,只返回
List
,然后迭代。@Tim:当然,但是原始方法使用了
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();
    }
    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;
    }