索引越界错误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;
}