【问题标题】:Iterate through an array in an object [duplicate]遍历对象中的数组[重复]
【发布时间】:2020-11-04 00:23:04
【问题描述】:

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

如果是这样,我有点迷茫,想知道如何到达主题领域而不是使用这种迭代?可能会补充说我是新手,所以非常感谢任何建议!

// Iteration problems
        for (int i = 0; i < (students[i].Grades.Length); i++)
        {
            Console.Write(" {0}: ", students[i].Grades[i].Subject);
        }

大上下文中的部分代码:

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;
    }
}

【问题讨论】:

  • students = new Student[5];Students 的5 元素数组分配给students,但实际上并未创建任何Student 实例。相反,students 的每个元素都是null,除非你不这样做。您需要执行与 Grades 相同的操作:为其元素分配一些实例。
  • 我学会了修复 NullReferenceEx 的一种方法是使用断点单步执行代码并查看什么是 null。然后一旦你找到什么是 null 设置一个条件来防止它为 null 或跳过它,如果它是 null 取决于你想要你的代码做什么。

标签: c# loops iteration


【解决方案1】:

您对学生和学生的成绩使用相同的索引 (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);
    }
}

或者您可以使用foreach 循环,这可以说是更干净:

foreach (var student in students)
{
    foreach (var grade in student.Grades)
    {
        Console.Write(" {0}: ", grade.Subject);
    }
}

您还需要在 student 数组中实际创建 Student 对象。您不能只实例化数组本身,否则所有元素都将为空。

public Student[] students = new Student[5];  // Array of 5 null elements
for (int i = 0; i < students.Length; ++i)
    students[i] = new Student();

【讨论】:

  • 谢谢!这使得它可以迭代五次等级。我只想打印一次艺术、地理和数学。 i.ibb.co/ZMLjtnX/fdf.png
  • @Sandro 你有 5 个学生。如果每个学生对这些科目中的每一个都有一个成绩,你怎么能只显示每个科目一次呢?您正在寻找的实际最终结果是什么?如果您只需要 1 个学生,请将 new Student[5] 更改为 new Student[1]
  • 是的,你是对的。我可能需要重新考虑这一点。因为我创建的每个学生的成绩都会显示多次,这是错误的......嗯。
猜你喜欢
  • 2018-04-22
  • 1970-01-01
  • 2018-07-05
  • 2017-08-25
  • 2013-08-25
  • 1970-01-01
  • 2020-01-13
  • 2017-09-19
相关资源
最近更新 更多