You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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();

代码解释

  1. 边界处理:先判断lstOcc是否为空,避免后续除以0的异常,同时返回合理的默认结果。
  2. 生成位置索引:用Enumerable.Range(0, critPositionCount)生成从0开始的所有位置索引,对应每个crit的位置。
  3. 统计空值数量:对每个索引,用Count()方法过滤出满足条件的对象(处理了lstcrit为null、索引越界的情况,避免运行时错误)。
  4. 计算百分比:将空值数量除以总对象数,乘以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:35:33