使用LINQ筛选与教师同城市国家的学生列表无循环实现方案
问题解决方法
报错原因说明
你第一种LINQ写法抛出类型转换异常的核心原因是:代码返回的是匿名类型的集合,如果你后续尝试将其强转为List<(Teacher, IEnumerable<Student>)>类型,就会触发转换错误——C#的匿名类型是编译器动态生成的独立类型,和你定义的值元组类型没有任何转换关系。
无显式循环的实现方案
直接用LINQ的Select方法将教师集合投影为你需要的元组集合即可,不需要手动写循环:
var result = teachers.Select(teacher => ( Teacher: teacher, Students: students.Where(s => s.Country == teacher.Country && s.City == teacher.City).ToList() ) ).ToList();
这个实现的运行逻辑和你现有的ForEach版本完全一致,底层由LINQ内部完成遍历,没有额外性能开销。
高性能优化方案(可选)
如果学生集合数据量较大,你可以先对学生按国家+城市分组建立索引,避免每次匹配都遍历全部学生,只需要遍历一次学生集合即可完成所有匹配:
// 按 国家+城市 为key建立学生分组索引 var studentCityLookup = students.ToLookup(s => new { s.Country, s.City }); var result = teachers.Select(teacher => ( Teacher: teacher, Students: studentCityLookup[new { teacher.Country, teacher.City }].ToList() ) ).ToList();
内容的提问来源于stack exchange,提问作者Maruf。
相关产品推荐
相关产品推荐

