在 C# 中按 2 列和 Max() 其他列分组
Posted
技术标签:
【中文标题】在 C# 中按 2 列和 Max() 其他列分组【英文标题】:Group By 2 column and Max() others in C# 【发布时间】:2021-11-03 01:00:48 【问题描述】:什么方法让我能够按 2 列分组并获得 MAX
彼此列
可以说我有这个:
DataTable dt = new DataTable();
dt.Columns.Add("s1", typeof(string));
dt.Columns.Add("s2", typeof(string));
dt.Columns.Add("nt1", typeof(int));
dt.Columns.Add("nt2", typeof(int));
// Here we add five DataRows.
dt.Rows.Add("g1", "gg1", 1, 16);
dt.Rows.Add("g2", "gg1", 2, 15);
dt.Rows.Add("g1", "gg1", 3, 14);
dt.Rows.Add("g2", "gg1", 4, 13);
dt.Rows.Add("g1", "gg2", 5, 12);
dt.Rows.Add("g2", "gg2", 6, 11);
dt.Rows.Add("g1", "gg2", 7, 10);
dt.Rows.Add("g2", "gg2", 8, 9);
我想要得到的是:
g1 gg1 3 16
g1 gg2 7 12
g2 gg1 4 15
g2 gg2 8 11
此代码不起作用:
dt = dt.AsEnumerable()
.GroupBy(r => new
s1 = r["s1"],
s2 = r["s2"]
)
.Select(x => x.Max())
.CopyToDataTable();
给我错误:
严重性代码描述项目文件行抑制状态错误 CS0311 类型 'System.Linq.IGrouping
' 不能使用 作为泛型类型或方法中的类型参数“T” 'DataTableExtensions.CopyToDataTable(IEnumerable)'。没有 来自 'System.Linq.IGrouping ' 到 'System.Data.DataRow'。测试 C:\Users\TECNO\source\repos\testt\testt\Program.cs 44 活跃
【问题讨论】:
这是怎么失败的_ 我添加了错误信息 只有IEnumerable<DataRow>
可以转换为DataTable。 GroupBy
不会返回。
【参考方案1】:
因此,由于类型不匹配,错误发生在CopyToDataTable
。您需要将GroupBy
的结果转换为IEnumerable
的DataRow
。
我很长时间没有在 LINQ 中工作,您需要在调用 CopyToDataTable
之前申请 Select
并确保选择 s1、s2、Max(nt1) 和 Max(nt2)。也许你还需要打电话给ToList
,我不确定,但你肯定需要在分组之后再打电话给Select
。
【讨论】:
【参考方案2】:好的,这段代码解决了问题
谢谢大家
var query = dt.AsEnumerable()
.GroupBy(x => new
s1 = x["s1"],
s2 = x["s2"]
)
.Select(grp => new
s1 = grp.Key.s1,
s2 = grp.Key.s2,
nt1 = grp.Max(x => x["nt1"]),
nt2 = grp.Max(x => x["nt2"])
);
DataTable dt2 = dt.Clone();
dt2.Clear();
foreach (var item in query)
dt2.Rows.Add(item.s1, item.s2, item.nt1, item.nt2);
【讨论】:
以上是关于在 C# 中按 2 列和 Max() 其他列分组的主要内容,如果未能解决你的问题,请参考以下文章