在 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 的结果转换为IEnumerableDataRow

我很长时间没有在 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() 其他列分组的主要内容,如果未能解决你的问题,请参考以下文章

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

在 LINQ 中按特定列分组 [重复]

在熊猫数据框中按 MinMaxScaler 分组

在R中按月对行求和

如何在 C# 中按 ID 对 JSON 数据进行分组

在 Python 中按列分组以获得总计数