【问题标题】:Getting the value of an inner list using LINQ使用 LINQ 获取内部列表的值
【发布时间】:2012-08-15 09:57:44
【问题描述】:

我有以下简单的数据结构。学生列表,每个学生都有一个唯一的 ID。每个学生都有一个他们注册的课程列表。课程也有唯一的 ID,但将是多个 studentCourses 列表的成员(因为每个课程都由多个学生注册)。

我正在尝试通过 studentId 和 courseId 查找特定的成绩值。我正在使用下面的 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();

【问题讨论】:

  • 只是另一种方式。 int studentGrade = students.FirstOrDefault(s =&gt; s.studentId == 1).studentCourses.FirstOrDefault(c =&gt; c.courseId==1).grade;

标签: c# linq


【解决方案1】:

我会使用一些查询语法:

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 来完成,这就是多个froms 所转换的内容。

【讨论】:

    【解决方案2】:
    int studentGrade = students
                          .Where(d=>d.studentId == 1)
                          .FirstOrDefault().studentCourses
                          .FirstOrDefault(d=>d.courseId == 1).grade;
    

    【讨论】:

      【解决方案3】:

      如果您确定学生和课程存在,那么

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多