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

Linq子组聚合问题:补全并修正分组统计代码

数据聚合问题

原始数据表

TypeItemActivityDone
AItem#1Act#1True
AItem#1Act#2True
AItem#1Act#3False
AItem#2Act#1True
AItem#2Act#2True
BItem#3Act#1False
BItem#3Act#2True
BItem#3Act#3False

期望聚合输出

TypeItemsCountItemsDoneItemsRemainingActivityCountActivityDoneActivityRemain
A211541
B101312

尝试代码

var _result = _itemModel.GroupBy(x => new { x.Type}).Select(y => new { 
    ItemsCount = y.Select(x => x.Item).Distinct().Count(), 
    ItemsDone= ????, 
    ItemsRemaining=????, 
    ActivityCount= y.Count(x => x.Type != null), 
    ActivityDone = y.Count(x => x.Completed == true), 
    ActivityReamin = y.Count(x => x.Completed == false) 
}).ToList();

修正后的代码

var _result = _itemModel
    .GroupBy(x => x.Type) // 按Type分组
    .Select(typeGroup => 
    {
        // 在Type组内按Item子分组
        var itemGroups = typeGroup.GroupBy(x => x.Item);
        
        int itemsCount = itemGroups.Count();
        // 统计所有Activity都完成的Item数量
        int itemsDone = itemGroups.Count(itemGroup => itemGroup.All(x => x.Done));
        int itemsRemaining = itemsCount - itemsDone;
        
        int activityCount = typeGroup.Count();
        int activityDone = typeGroup.Count(x => x.Done);
        int activityRemain = activityCount - activityDone;
        
        return new 
        {
            Type = typeGroup.Key,
            ItemsCount = itemsCount,
            ItemsDone = itemsDone,
            ItemsRemaining = itemsRemaining,
            ActivityCount = activityCount,
            ActivityDone = activityDone,
            ActivityRemain = activityRemain
        };
    })
    .ToList();

关键说明

  • 先按Type分组,再在每个分组内按Item做二次子分组,实现层级统计
  • ItemsDone通过All(x => x.Done)判断该Item下所有活动是否全部完成,统计符合条件的Item数量
  • 剩余统计项通过基础数值计算得出,减少集合遍历次数

内容的提问来源于stack exchange,提问作者Hussein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:52:43