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

C# Linq分组:按维度获取可转Int的RefNo列最小/最大值

解决方案:分组统计时过滤无效RefNo并获取最小/最大有效值

原始数据

DateRefNoMasterNameValueType
01-01-202045ABC Pty Ltd123.45Sales
01-01-20202XYZ Ltd134.5Sales
01-01-202046ABC Pty Ltd765Sales
01-01-202047ABC Pty Ltd465.4Sales
01-01-20203XYZ Ltd468Sales
01-01-2020S_1ABC Pty Ltd678Sales
01-01-2020S_2XYZ Ltd68Sales

你的现有查询代码

var query = data.GroupBy(row => new { row.Date, row.MasterName, row.Type })
    .Select(grp => new MasterAccount {
        Date = grp.Key.Date,
        Name = grp.Key.MasterName,
        Type = grp.Key.Type,
        Amount = grp.Sum(c => c.Value),
        MinRef = // 获取最小RefNo(类型:int)
        MaxRef = // 获取最大RefNo(类型:int)
    });

修改后的完整查询代码

核心思路是先在分组内筛选出可转换为int的有效RefNo,再对这些有效值取最小/最大值,用int.TryParse避免转换异常:

var query = data.GroupBy(row => new { row.Date, row.MasterName, row.Type })
    .Select(grp => {
        // 筛选并转换所有有效的RefNo为int类型
        var validRefNumbers = grp
            .Where(row => int.TryParse(row.RefNo, out _)) // 只保留能转成int的记录
            .Select(row => int.Parse(row.RefNo)); // 这里转换是安全的,因为已经过滤过

        return new MasterAccount {
            Date = grp.Key.Date,
            Name = grp.Key.MasterName,
            Type = grp.Key.Type,
            Amount = grp.Sum(c => c.Value),
            // 有有效值则取最小/最大,否则返回默认值(根据你的需求调整)
            MinRef = validRefNumbers.Any() ? validRefNumbers.Min() : 0,
            MaxRef = validRefNumbers.Any() ? validRefNumbers.Max() : 0
        };
    });

额外优化建议

如果你的MasterAccount类中MinRef和MaxRef允许为null(即定义为int?类型),可以把默认值改成null,这样更能准确表示“无有效RefNo”的情况:

MinRef = validRefNumbers.Any() ? validRefNumbers.Min() : (int?)null,
MaxRef = validRefNumbers.Any() ? validRefNumbers.Max() : (int?)null

这样处理后,ABC Pty Ltd分组的MinRef会是45,MaxRef会是47;XYZ Ltd分组的MinRef是2,MaxRef是3,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:02:33