C# 使用LINQ结合嵌套列表筛选课程时如何避免重复返回结果
问题原因
- 你使用了双层
from查询,相当于把课程和学生做了笛卡尔积关联,课程下有多少个符合平均分>60的学生,这个课程就会在结果集中出现多少次,天然就会产生重复的课程实例。 - 你原代码的
foreach遍历的是未经过筛选的原始CoursesList,根本没有用到你写的Above60筛选结果,就算查询逻辑正确也得不到预期输出。 - 另外你提供的类定义有笔误:
Course类里的StudentsList类型写为List<Course>,实际应该是List<Student>,同时私有字段无法直接外部访问,建议改成公共属性或者提供对应的访问方法。
修复方案
推荐使用Any方法改写查询,直接判断课程下是否存在符合条件的学生,不会产生重复数据,性能也更高:
// 筛选所有至少有1名学生平均分超过60的课程,每个课程仅保留1个实例 var Above60 = from course in CoursesList where course.StudentList.Any(student => student.GetAverage() > 60) select course; // 遍历筛选后的结果集,而非原始课程列表 foreach(var course in Above60) { Console.WriteLine(course.CourseName); }
如果你要保留原来的双层from写法,只需要在查询末尾追加Distinct()方法去重即可,注意同样要遍历Above60而非原始列表:
var Above60 = (from course in CoursesList from student in course.StudentList where student.GetAverage() > 60 select course).Distinct();
内容的提问来源于stack exchange,提问作者DorD
相关产品推荐
相关产品推荐

