没有明显的原因导致列表中的索引越界(C#)?
我是C#的新手,我已经编写了一个程序,在特定程序中为我提供超出范围的索引。理论上我看不出我有什么理由得到这个。该错误在控制台中输出,但不会使程序崩溃。 我有三门课,分别是逻辑课、学生课和主课。当我试图打印出所有学生的名单时,我得到了一个错误。 Student包含名称、FN和双精度形式的分数数组 在Student.cs中 学生被添加到一个列表中(此处未显示),成绩也可以是40,但学生实际上没有40个成绩,因此空白处为空->没有明显的原因导致列表中的索引越界(C#)?,c#,list,console-application,C#,List,Console Application,我是C#的新手,我已经编写了一个程序,在特定程序中为我提供超出范围的索引。理论上我看不出我有什么理由得到这个。该错误在控制台中输出,但不会使程序崩溃。 我有三门课,分别是逻辑课、学生课和主课。当我试图打印出所有学生的名单时,我得到了一个错误。 Student包含名称、FN和双精度形式的分数数组 在Student.cs中 学生被添加到一个列表中(此处未显示),成绩也可以是40,但学生实际上没有40个成绩,因此空白处为空-> public Student (string namee, int FNe
public Student (string namee, int FNe, double[] gradese)
{
name = namee;
FN = FNe;
grades = gradese;
}
public void print()
{
Console.WriteLine(name);
Console.WriteLine(FN);
double z = 0;
int j = 0;
while(grades[j] != 0)
{
Console.Write(grades[j]);
z += grades[j];
j++;
}
Console.WriteLine($"average: {z/j}" );
}
List<Student> myList = new List<Student>();
public void print()
{
for (int i = 0; i < myList.Count ; i++)
{
myList[i].print();
}
}
在“logic.cs”中
学生被添加到一个列表中(此处未显示),成绩也可以是40,但学生实际上没有40个成绩,因此空白处为空->
public Student (string namee, int FNe, double[] gradese)
{
name = namee;
FN = FNe;
grades = gradese;
}
public void print()
{
Console.WriteLine(name);
Console.WriteLine(FN);
double z = 0;
int j = 0;
while(grades[j] != 0)
{
Console.Write(grades[j]);
z += grades[j];
j++;
}
Console.WriteLine($"average: {z/j}" );
}
List<Student> myList = new List<Student>();
public void print()
{
for (int i = 0; i < myList.Count ; i++)
{
myList[i].print();
}
}
第73行和第37行分别是Student和Logic中的循环(while和for)将
for
循环更改为使用foreach
循环
更改此项:
for (int i = 0; i < myList.Count - 1; i++)
{
myList[i].print();
}
for-each循环将迭代每个元素。在这种情况下,代码中的任何其他地方都不会增加i
,因此建议使用for each
未处理的异常:System.IndexOutOfRangeException:索引超出了数组的界限
表示超出了数组等级的数组边界
while(grades[j] != 0)
{
...
j++;
}
…不是正确的方法,您需要检查是否存在错误
你可以把这个和一个类似的
for (int i = 0; i < grades.Length; i++)
{
...
}
你可能想要这样的东西
...
double average = CalculateAverage(grades);
...
private double CalculateAverage(double[] grades)
{
double sum = 0;
int numberOfGrades = 0;
for (int i = 0; i < grades.Length; i++)
{
if (grades[i] == 0)
continue;
sum += grades[i];
numberOfGrades++;
}
return sum / numberOfGrades;
}
。。。
双倍平均值=计算平均值(等级);
...
私人双学位(双[]年级)
{
双和=0;
int numberOfGrades=0;
对于(int i=0;i
您似乎已经超出了数组的数组边界等级
。为什么不在
-循环中使用而不是?就像第二个例子中的for(inti=0;i
一样,您没有向myList添加任何内容。您需要检查myList。Count大于0,然后您将不会得到超出边界的错误。由于myList没有添加任何值,它试图访问不存在的-1。显示的代码试图迭代空列表。为什么不直接使用foreach呢?您的logic.cs for循环中还有一个逻辑错误。如果在myList
中只有一项,您认为循环会运行多少次?提示:如果i==0
和myList.Count==1
,您认为表达式i
中会发生什么情况?@JatosDetking请停止评论并创建一个我们可以复制粘贴并运行的文件。这里的一般问题很简单——您要求的是一个不存在的索引(请参阅复制链接)。如果你想要更具体的建议,那么你需要向我们展示编译过的代码。但是如果等级像数组一样,有40个元素长,但我只填充了20个元素,那会怎么样呢?我只想要这20个的平均值,其他的都是零?就像我制作X元素数组,但我只填充Y元素,是吗Doubles@JatosDetking,那么您要么必须记住数组中某个位置的值的数量,比如整数变量中的整数值,要么可以使用另一种能够动态增长和收缩的数据结构,比如。另一种方法是排除值“0”,因为它很可能不是有效的等级。@JatosDetking:您也可以将条件设为AND条件:(grades[j]!=0&&j...
double average = CalculateAverage(grades);
...
private double CalculateAverage(double[] grades)
{
double sum = 0;
int numberOfGrades = 0;
for (int i = 0; i < grades.Length; i++)
{
if (grades[i] == 0)
continue;
sum += grades[i];
numberOfGrades++;
}
return sum / numberOfGrades;
}