gpt4 book ai didi

c# - Linq 在多层上对 IEnumerable 进行排序

转载 作者:行者123 更新时间:2023-11-30 13:55:11 27 4
gpt4 key购买 nike

我正在编写一个简单的测试应用程序来展示如何对我将从 EF 上下文中获取的列表进行排序。

“目标”是得到一个列表,按 Student.Name 排序,然后是 Subject.Name

public class Student
{
public string Name {get;set;}
public List<ExamScore> ExamScores{get;set;}
}

public class Subject
{
public string Name{get;set;}
}

public class ExamScore
{
public Subject Subject{get;set;}
public int Score{get;set;}
}

一级排序很简单:

var list = con.Students
.Include(e => e.ExamScores
.Select(s => s.Subjects))
.OrderBy(x => x.Name) //student.Name
.ToList();

但是添加下一个级别让我感到困惑。

var list = con.Students
.Include(e => e.ExamScores
.Select(s => s.Subjects))
.OrderBy(x => x.Name) //student.Name
.ThenBy(y => y.ExamScores.???) //subject name???
.ToList();

输入

Student{"Jannie", ExamScore{ Subject{"Math"}, 90}}
Student{"Jannie", ExamScore{ Subject{"History"}, 70}}
Student{"Jannie", ExamScore{ Subject{"Science"}, 90}}

Student{"Koos", ExamScore{ Subject{"Xhosa"}, 83}}
Student{"Koos", ExamScore{ Subject{"Afrikaans"}, 74}}
Student{"Koos", ExamScore{ Subject{"English"}, 78}}

Student{"Pieter", ExamScore{ Subject{"Afrikaans"}, 65}}
Student{"Pieter", ExamScore{ Subject{"History"}, 80}}
Student{"Pieter", ExamScore{ Subject{"Math"}, 70}}

Student{"Sannie", ExamScore{ Subject{"Science"}, 60}}
Student{"Sannie", ExamScore{ Subject{"Math"}, 55}}
Student{"Sannie", ExamScore{ Subject{"Biology"}, 75}}

Student{"Magriet", ExamScore{ Subject{"Biology"}, 75}}
Student{"Magriet", ExamScore{ Subject{"English"}, 80}}
Student{"Magriet", ExamScore{ Subject{"Science"}, 90}}

预期输出

Student{"Jannie", ExamScore{ Subject{"History"}, 70}}
Student{"Jannie", ExamScore{ Subject{"Math"}, 90}}
Student{"Jannie", ExamScore{ Subject{"Science"}, 90}}

Student{"Koos", ExamScore{ Subject{"Afrikaans"}, 74}}
Student{"Koos", ExamScore{ Subject{"English"}, 78}}
Student{"Koos", ExamScore{ Subject{"Xhosa"}, 83}}

Student{"Magriet", ExamScore{ Subject{"Biology"}, 75}}
Student{"Magriet", ExamScore{ Subject{"English"}, 80}}
Student{"Magriet", ExamScore{ Subject{"Science"}, 90}}

Student{"Pieter", ExamScore{ Subject{"Afrikaans"}, 65}}
Student{"Pieter", ExamScore{ Subject{"History"}, 80}}
Student{"Pieter", ExamScore{ Subject{"Math"}, 70}}

Student{"Sannie", ExamScore{ Subject{"Biology"}, 75}}
Student{"Sannie", ExamScore{ Subject{"Math"}, 55}}
Student{"Sannie", ExamScore{ Subject{"Science"}, 60}}

最佳答案

您需要做的是首先展平 Student->Subject 关系,然后您就可以对两者进行排序:

var list = con.Students.Include(e => e.ExamScores.Select(s => s.Subjects))
.SelectMany(student => student.ExamScores.Select(score => new { Student = student, Score = score }))
.OrderBy(x => x.Student.Name)
.ThenBy(x => x.Score.Subject.Name);

这将生成一个可枚举的匿名对象,其中包含按学生姓名和科目名称排序的学生和分数。

关于c# - Linq 在多层上对 IEnumerable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36640991/

27 4 0