如何用LINQ方法语法处理含int与string类型的查询交集?
问题分析与解决方案
错误原因
你遇到的'string' does not contain a definition for 'Score'错误,核心问题是过早用Select(x => x.StudentName)把Student对象转换成了字符串类型,后续代码试图从字符串访问Score属性自然会报错;另外你把学生姓名、分数拆成独立集合处理,完全割裂了数据间的关联逻辑。
正确思路
- 一次性过滤出符合所有条件的学生:活跃状态(
StudentActvity = true)、居住在加州(StudentCity = "CA")、姓名包含R/r或D/d。 - 从过滤后的结果中,同时获取学生姓名、分数,再计算平均分。
正确代码实现
using System; using System.Collections.Generic; using System.Linq; namespace _64_LINQ_Practice { class Program { static void Main(string[] args) { var studentList = StudentDatabase.GetStudentsFromDb(); // 过滤符合所有条件的学生,保留完整数据关联 var filteredStudents = studentList .Where(student => student.StudentActvity && student.StudentCity == "CA" && (student.StudentName.IndexOf('R', StringComparison.OrdinalIgnoreCase) >= 0 || student.StudentName.IndexOf('D', StringComparison.OrdinalIgnoreCase) >= 0)); // 输出符合条件的学生姓名和分数 Console.WriteLine("符合条件的学生信息:"); foreach (var student in filteredStudents) { Console.WriteLine($"姓名:{student.StudentName},分数:{student.Score}"); } // 计算并输出平均分(先判断是否有符合条件的学生,避免除以0异常) if (filteredStudents.Any()) { var averageScore = filteredStudents.Average(student => student.Score); Console.WriteLine($"\n这些学生的平均分:{averageScore:F2}"); } else { Console.WriteLine("\n没有符合条件的学生"); } } } }
代码说明
- 用一次
Where完成全条件过滤,保留Student对象的完整数据,确保姓名和分数的关联关系不丢失。 - 使用
IndexOf结合StringComparison.OrdinalIgnoreCase,可以更简洁地实现大小写不敏感的字符包含判断。 - 添加
Any()判断,避免没有符合条件的学生时调用Average抛出空集合异常。 - 用字符串插值
$""让输出格式更清晰易读。
内容的提问来源于stack exchange,提问作者yas
相关产品推荐
相关产品推荐

