如何使用Linq统计Yes/No列中Yes值的占比百分比
问题排查与修复方案
错误原因
你计算CloseRed百分比的代码错误出在分母的统计逻辑:
stocks.Count(x => x.CloseRed)属于非法写法:Count()方法要求传入返回布尔值的筛选条件,而CloseRed是字符串类型的字段,不能直接作为判断条件,这行代码会直接编译报错,即使特殊场景下能运行也无法获取到正确的总记录数。- 你需要的分母是全部股票的总记录数,直接调用无参的
stocks.Count()即可。
修复后的代码
基础修复版(无异常处理)
将原计算CloseRed的代码替换为:
allstock.CloseRed = Math.Round((decimal)stocks.Count(x => x.CloseRed == "Yes") / stocks.Count() * 100, 2);
注:因为
CloseRed是明确的Yes/No枚举值,用全等判断== "Yes"比Contains("Yes")更精准,避免部分匹配导致的统计错误。
兼容空数据版(避免除零报错)
如果存在股票总记录数为0的场景,需要增加空判断避免除以零异常:
int totalCount = stocks.Count(); allstock.CloseRed = totalCount == 0 ? 0 : Math.Round((decimal)stocks.Count(x => x.CloseRed == "Yes") / totalCount * 100, 2);
可选优化建议
如果你的IRepository.GetAllStocks()返回的是IQueryable<Stock>而非已经加载到内存的IEnumerable<Stock>,可以把百分比计算逻辑放在数据库侧执行,避免加载全量数据到内存,提升执行效率:
// 直接在数据库层面统计,不需要拉取所有股票数据 var closeRedCount = _statsRepository.GetAllStocks().Count(x => x.CloseRed == "Yes"); var totalCount = _statsRepository.GetAllStocks().Count(); allstock.CloseRed = totalCount == 0 ? 0 : Math.Round((decimal)closeRedCount / totalCount * 100, 2);
内容的提问来源于stack exchange,提问作者F.OLeary
相关产品推荐
相关产品推荐

