没有明显的原因导致列表中的索引越界(C#)?

没有明显的原因导致列表中的索引越界(C#)?,c#,list,console-application,C#,List,Console Application,我是C#的新手,我已经编写了一个程序,在特定程序中为我提供超出范围的索引。理论上我看不出我有什么理由得到这个。该错误在控制台中输出,但不会使程序崩溃。 我有三门课,分别是逻辑课、学生课和主课。当我试图打印出所有学生的名单时,我得到了一个错误。 Student包含名称、FN和双精度形式的分数数组 在Student.cs中 学生被添加到一个列表中(此处未显示),成绩也可以是40,但学生实际上没有40个成绩,因此空白处为空-> public Student (string namee, int FNe

我是C#的新手,我已经编写了一个程序,在特定程序中为我提供超出范围的索引。理论上我看不出我有什么理由得到这个。该错误在控制台中输出,但不会使程序崩溃。 我有三门课,分别是逻辑课、学生课和主课。当我试图打印出所有学生的名单时,我得到了一个错误。 Student包含名称、FN和双精度形式的分数数组

在Student.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();
    }
}
在“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; }