如何用C#非foreach方式计算对象列表中各位置crit的空值占比
用LINQ优雅实现位置级空值百分比统计
嘿,想要脱离foreach提升C#水平的话,LINQ绝对是最佳选择之一!针对你这个需求,我们可以用声明式的LINQ操作来实现,代码更简洁易读,也更符合现代C#的风格。
需求回顾
我们需要统计每个位置(比如第1个、第2个…第20个)的crit对象中,ValeurCrit为空的百分比,最终生成对应长度的百分比列表。假设所有Objet的lstcrit长度一致(比如固定20个)。
解决方案代码
首先处理边界情况,再用LINQ完成统计:
// 先获取总对象数,避免除以0的问题 int totalObjects = lstOcc.Count; if (totalObjects == 0) { // 空列表时返回全0的百分比列表(长度按需求设为20) return Enumerable.Repeat(0.0, 20).ToList(); } // 确定每个Objet的crit数量(这里假设所有对象的lstcrit长度一致) int critPositionCount = lstOcc.First()?.lstcrit?.Count ?? 0; // 生成每个位置的空值百分比 var emptyValuePercentages = Enumerable.Range(0, critPositionCount) .Select(positionIndex => { // 统计该位置下ValeurCrit为空的对象数量 int emptyCount = lstOcc.Count(obj => obj.lstcrit != null && // 避免lstcrit为null的情况 positionIndex < obj.lstcrit.Count && // 避免索引越界 string.IsNullOrEmpty(obj.lstcrit[positionIndex].ValeurCrit)); // 计算百分比(保留小数,乘以100转为百分比格式) return (double)emptyCount / totalObjects * 100; }) .ToList();
代码解释
- 边界处理:先判断
lstOcc是否为空,避免后续除以0的异常,同时返回合理的默认结果。 - 生成位置索引:用
Enumerable.Range(0, critPositionCount)生成从0开始的所有位置索引,对应每个crit的位置。 - 统计空值数量:对每个索引,用
Count()方法过滤出满足条件的对象(处理了lstcrit为null、索引越界的情况,避免运行时错误)。 - 计算百分比:将空值数量除以总对象数,乘以100得到百分比值。
简化版(当确定数据规范时)
如果能保证所有Objet的lstcrit不为null且长度固定为20,可以简化代码:
var emptyValuePercentages = Enumerable.Range(0, 20) .Select(i => (double)lstOcc.Count(o => string.IsNullOrEmpty(o.lstcrit[i].ValeurCrit)) / lstOcc.Count * 100) .ToList();
为什么这比foreach更优?
- 声明式编程:你只需要告诉程序“要统计每个位置的空值百分比”,而不需要手动写循环、维护计数器,代码意图更清晰。
- 可维护性:LINQ代码更简洁,后续修改需求(比如过滤其他条件)时,只需要调整
Select或Count里的逻辑即可。 - 扩展性:可以轻松结合其他LINQ操作(比如排序、分组),如果后续需求变化,代码调整成本更低。
内容的提问来源于stack exchange,提问作者user1069516
相关产品推荐
相关产品推荐

