3

私は次のような単純なデータ構造を持っています。それぞれが一意の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();
4

3 に答える 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のが変換されるものです。

于 2012-08-15T10:02:09.270 に答える
1
int studentGrade = students
                      .Where(d=>d.studentId == 1)
                      .FirstOrDefault().studentCourses
                      .FirstOrDefault(d=>d.courseId == 1).grade;
于 2012-08-15T10:03:55.763 に答える
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;
于 2012-08-15T10:32:25.087 に答える