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

C#中如何对DataTable按两列分组并获取其余列的MAX值

错误根因

你的代码报错有两个核心问题:

  1. GroupBy返回的是IGrouping<匿名类, DataRow>类型集合,直接调用x.Max()没有指定取哪个字段的最大值,且返回结果不是DataRow类型,无法匹配CopyToDataTable()要求的输入类型参数。
  2. 多列分组时直接用r["s1"]返回的是object类型,会导致分组逻辑异常,需要明确转成对应字段类型。

正确实现代码

写法1:先克隆表结构逐行添加

// 克隆原表结构,保留列名和数据类型
DataTable resultDt = dt.Clone();

dt.AsEnumerable()
    .GroupBy(r => new 
    { 
        S1 = r.Field<string>("s1"), 
        S2 = r.Field<string>("s2") 
    })
    .ToList()
    .ForEach(g => 
    {
        // 计算分组内两个数值列的最大值
        int maxNt1 = g.Max(r => r.Field<int>("nt1"));
        int maxNt2 = g.Max(r => r.Field<int>("nt2"));
        // 插入结果行
        resultDt.Rows.Add(g.Key.S1, g.Key.S2, maxNt1, maxNt2);
    });

// 如需赋值回原变量直接用 dt = resultDt; 即可

写法2:链式调用直接使用CopyToDataTable

dt = dt.AsEnumerable()
    .GroupBy(r => new 
    { 
        S1 = r.Field<string>("s1"), 
        S2 = r.Field<string>("s2") 
    })
    .Select(g => 
    {
        DataRow newRow = dt.NewRow();
        newRow["s1"] = g.Key.S1;
        newRow["s2"] = g.Key.S2;
        newRow["nt1"] = g.Max(r => r.Field<int>("nt1"));
        newRow["nt2"] = g.Max(r => r.Field<int>("nt2"));
        return newRow;
    })
    .CopyToDataTable();

两种写法运行后得到的结果都和你给出的期望输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:06:04