使用LINQ获取内部列表的值

3
我有一个简单的数据结构,一个学生列表,每个学生都有唯一的ID。每个学生都有一个所注册课程的列表。课程也具有唯一的ID,但将成为多个studentCourses列表的成员(因为多个学生都注册了该课程)。
我尝试通过学生ID和课程ID找到特定的成绩值。 我使用下面的linq查询语句。 我对我的linq还有点不确定,想知道我编写的查询是否正确? 它确实可以正常工作,但是否能更优雅/易读?
class Student {
    int studentId;
    string studentName;
    List<Course> studentCourses;
}

class Course {
    int courseId;
    string courseName;
    int grade;
}

List<Student> students = new List<Student>();
//populate list.                
int studentGrade = students
    .Where(c => c.studentId == 1)
    .Select(c => c.studentCourses.FirstOrDefault(a => a.courseId == 1).grade)
    .FirstOrDefault();

1
只是另一种方式。int studentGrade = students.FirstOrDefault(s => s.studentId == 1).studentCourses.FirstOrDefault(c => c.courseId==1).grade; - L.B
3个回答

4
我会使用一些查询语法:
var studentGrade = 
    (from student in students
    where student.studentId == 1
    from course in student.studentCourses
    where course.courseId == 1
    select course.grade)
        .FirstOrDefault();

如果查找的任何部分(学生/课程)失败,则序列将为空,FirstOrDefault将返回零。
这也可以使用SelectMany完成,这是这些多个from所转换的内容。

1
int studentGrade = students
                      .Where(d=>d.studentId == 1)
                      .FirstOrDefault().studentCourses
                      .FirstOrDefault(d=>d.courseId == 1).grade;

0
如果您确定学生和课程存在,则:
int studentGrade = students
                      .FirstOrDefault(s => s.studentId == 1).studentCourses
                      .FirstOrDefault(c => c.courseId == 1).grade;

否则类似于

var student = students.FirstOrDefault(s => s.studentId == 1);
var course = student != null ? student.studentCourses.FirstOrDefault(c => c.courseId == 1) : null;
int studentGrade = course != null ? course.grade : -1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接