使用我的函数返回因子,我得到一个我不应该的错误。
这是我的代码:
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
中其他信息:索引超出了数组的范围。
答案 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();
}