C#:如何从分组后的学生成绩集合中提取指定科目的成绩并填充到对应属性
C#:如何从分组后的学生成绩集合中提取指定科目的成绩并填充到对应属性
嘿,这问题我熟!你现在已经把学生按班级、姓氏和首字母分组好了,接下来要把不同科目的成绩对应到Algebra、Geometry这些属性里对吧?其实用FirstOrDefault加条件判断就能轻松搞定,还能顺便处理学生没考某科的情况。
直接给你修改后的核心代码段:
var result = group.GroupBy(g => new { g.Class, g.Surname, g.Initials}) .Select(s => new { s.Key.Class, s.Key.Surname, s.Key.Initials, // 提取Algebra科目成绩,找不到就给默认值0(可按需调整) Algebra = s.FirstOrDefault(x => x.Object == "Algebra")?.Mark ?? 0, // 提取Geometry科目成绩 Geometry = s.FirstOrDefault(x => x.Object == "Geometry")?.Mark ?? 0, // 提取Informatics科目成绩 Informatics = s.FirstOrDefault(x => x.Object == "Informatics")?.Mark ?? 0 }).OrderBy(o => o.Class);
给你拆解下逻辑:
s.FirstOrDefault(x => x.Object == "Algebra"):从当前分组(也就是同一个学生的所有成绩)里,找到科目为Algebra的那条记录?.Mark:因为FirstOrDefault可能返回null(学生没这科成绩),所以用空安全访问符避免空引用异常?? 0:如果真的找不到对应科目的成绩,就给个默认值0,你也可以改成(int?)null来存储空值(前提是你的匿名类里这些属性要支持可空类型)
要是后续有更多固定科目要加,直接照着这个格式加新的属性就行,非常直观。如果科目是动态的(比如从配置里读),那可能要改用字典来存,但你现在是固定科目,这种写法最直接好用。
备注:内容来源于stack exchange,提问作者TICH
相关产品推荐
相关产品推荐

