Linq Sum方法报错:无法将IEnumerable转换为Func问题排查
解决LINQ Sum方法的参数错误问题
嘿,我来帮你理清这个问题的根源,以及怎么修复它!
你的代码错误原因
你当前的代码:
int minutes = i.Activities.Sum(i.Activities.Where(x => x.Checked == 'y'));
报错的核心原因是:Sum()方法在这里需要接收一个投影委托(也就是Func<Activity, int>),用来告诉它要从每个Activity对象中提取哪个数值来求和。但你直接把Where()返回的IEnumerable<Activity>(筛选后的活动集合)传给了Sum(),这完全不符合它的参数要求,所以编译器会抛出类型转换错误。
正确的两种写法
写法一:先筛选再求和(更直观)
先通过Where()过滤出Checked为'y'的活动,再用Sum()提取它们的Time属性求和:
int minutes = i.Activities.Where(x => x.Checked == 'y').Sum(x => x.Time);
写法二:直接在Sum中加入条件(更简洁)
你也可以把筛选逻辑直接放到Sum()的投影函数里,符合条件就取Time,不符合就取0(相当于不贡献数值):
int minutes = i.Activities.Sum(x => x.Checked == 'y' ? x.Time : 0);
验证你的示例
对于你给出的三个活动:
- Activity 1: Time=5,Checked=y
- Activity 2: Time=5,Checked=n
- Activity 3: Time=5,Checked=y
两种写法都会计算5+5=10,完全符合你的预期结果。
内容的提问来源于stack exchange,提问作者Kahn Kah
相关产品推荐
相关产品推荐

