C#中如何对DataTable按两列分组并获取其余列的MAX值
错误根因
你的代码报错有两个核心问题:
GroupBy返回的是IGrouping<匿名类, DataRow>类型集合,直接调用x.Max()没有指定取哪个字段的最大值,且返回结果不是DataRow类型,无法匹配CopyToDataTable()要求的输入类型参数。- 多列分组时直接用
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
相关产品推荐
相关产品推荐

