Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 迭代对象中的数组_C#_Loops_Iteration - Fatal编程技术网

C# 迭代对象中的数组

C# 迭代对象中的数组,c#,loops,iteration,C#,Loops,Iteration,我试图遍历在students对象中启动的等级数组,但得到“对象引用未设置为对象实例”。我相信(int I=0;I

我试图遍历在students对象中启动的等级数组,但得到“对象引用未设置为对象实例”。我相信(int I=0;I<(students[I].Grades.Length);I++)的下一行
只会运行三次(Grades数组的大小),然后终止,但它似乎是为了完成学生的迭代:

如果是这样的话,我就有点迷茫了,我想知道如何到达主题领域,而不是使用这种迭代?可能还要补充一点,我是个新手,所以任何建议都非常感谢

// Iteration problems
        for (int i = 0; i < (students[i].Grades.Length); i++)
        {
            Console.Write(" {0}: ", students[i].Grades[i].Subject);
        }
//迭代问题
对于(int i=0;i<(学生[i]。成绩。长度);i++)
{
Console.Write(“{0}:”,学生[i]。成绩[i]。科目);
}
较大上下文中的部分代码:

class Program
{
    static void Main(string[] args)
    {
        public Student[] students = new Student[] { };
        students = new Student[5];

// Iteration problems

        for (int i = 0; i < (students[i].Grades.Length); i++)
        {
            Console.Write(" {0}: ", students[i].Grades[i].Subject);
        }
    } 
}
class Student
{
    public GradeSubject[] Grades { get; set; } = new GradeSubject[] 
    {
        new GradeSubject("Art"),
        new GradeSubject("Geography"),
        new GradeSubject("Math"),
    };
}
public class GradeSubject
{
    private string subject;
    private char letter;

    // Properties
    public string Subject { get { return subject; } set { subject = value; } }
    public char Letter { get { return letter; } set { letter = value; } }

    public GradeSubject(string _subject)
    {
        subject = _subject;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
公立学生[]学生=新学生[]{};
学生=新生[5];
//迭代问题
对于(int i=0;i<(学生[i]。成绩。长度);i++)
{
Console.Write(“{0}:”,学生[i]。成绩[i]。科目);
}
} 
}
班级学生
{
public GradeSubject[]成绩{get;set;}=new GradeSubject[]
{
新课程科目(“艺术”),
新年级科目(“地理”),
新年级科目(“数学”),
};
}
公营班级科目
{
私有字符串主题;
私人信件;
//性质
公共字符串Subject{get{return Subject;}set{Subject=value;}}
公共字符字母{get{return Letter;}set{Letter=value;}}
公共等级科目(字符串_科目)
{
主语=_主语;
}
}

您对学生和学生的成绩使用了相同的索引(
i
)。您真正需要的是一个嵌套循环,一个循环遍历学生,一个内部循环遍历该学生的成绩:

for (int i = 0; i < students.Length; ++i)
{
    for (int j = 0; j < students[i].Grades.Length; ++j)
    {
        Console.Write(" {0}: ", students[i].Grades[j].Subject);
    }
}
您还需要在
Student
数组中实际创建
Student
对象。不能只实例化数组本身,否则所有元素都将为null

public Student[] students = new Student[5];  // Array of 5 null elements
for (int i = 0; i < students.Length; ++i)
    students[i] = new Student();
public Student[]students=新生[5];//由5个空元素组成的数组
for(int i=0;i
这回答了您的问题:
学生=新学生[5]
学生
的5元素数组分配给
学生
,但实际上不创建任何
学生
实例。相反,
students
的每个元素都是
null
,除非您将其改为null。您需要执行与处理
等级
相同的操作:为其元素分配一些实例。我学习的修复NullReferenceEx的一种方法是使用断点单步遍历代码并查看什么是null。然后,一旦你发现什么是空的,设置一个条件,以防止它为空或跳过它,如果是空的,这取决于你想要你的代码做什么。谢谢!这使得它在年级上迭代了五次。我只想把艺术、地理和数学印一次@你有5个学生。如果每个学生都有这些科目的分数,你怎么能只显示每个科目一次?你想要的最终结果是什么?如果您只需要一名学生,那么将
新学生[5]
更改为
新学生[1]
。是的,您是对的。我可能需要重新考虑一下。因为对于我创建的每个学生,分数将显示相同的次数,这是错误的。。。隐马尔可夫模型。
public Student[] students = new Student[5];  // Array of 5 null elements
for (int i = 0; i < students.Length; ++i)
    students[i] = new Student();