数据表的分组与求和

3

我有一个数据表,其中包含以下数据

最初的回答:

Number   Type   Order  count
1        1      R       1
1        1      R       1
1        1      R       1
1        2      R       1

最初的回答
我想要达到这个结果。

我正在寻找实现这一目标的方法。

Number   Type   Order  count
1        1      R       3
1        2      R       1

我能如何将三列进行分组?

最初的回答:

  var result = dt.AsEnumerable()
                 .GroupBy(x => {x.Field<string>("Number"))//need to group by Type and order  also need to sum te total counts

这可能会对您有所帮助:https://dev59.com/7WQo5IYBdhLWcg3wXuen - Kuba Do
以上示例不适用于数据表。 - rgoal
1个回答

6

你的问题让我很好奇,所以我在Stack Overflow上进行了一些调查。
esc的回答似乎也可以解决你的问题。它发布在:如何在DataTable.Select(Expression)中使用SELECT GROUP BY?

将他的方法应用于你的问题,我得到了这个解决方案:

DataTable dt2 = dt.AsEnumerable()
    .GroupBy(r => new { Number = r["Number"], Type = r["Type"], Order = r["Order"] })
    .Select(g =>
    {
        var row = dt.NewRow();

        row["Number"] = g.Key.Number;
        row["Type"] = g.Key.Type;
        row["Order"] = g.Key.Order;
        row["Count"] = g.Count();

        return row;

    }).CopyToDataTable();

这将返回一个与输入DataTable的模式匹配,并包含所请求的分组和计数的DataTable。
这是我在LINQPad中使用的完整代码:
DataTable dt = new DataTable("Demo");

dt.Columns.AddRange 
(
    new DataColumn[] 
      {
         new DataColumn ( "Number", typeof ( int ) ),
         new DataColumn ( "Type", typeof ( int ) ),
         new DataColumn ( "Order", typeof ( string ) ),
         new DataColumn ( "Count", typeof ( int ) )  
      }
);

dt.Rows.Add(new object[] { 1,1,"R", 1 });
dt.Rows.Add(new object[] { 1,1,"R", 1 });
dt.Rows.Add(new object[] { 1,1,"R", 1 });
dt.Rows.Add(new object[] { 1,2,"R", 1 });


DataTable dt2 = dt.AsEnumerable()
    .GroupBy(r => new { Number = r["Number"], Type = r["Type"], Order = r["Order"] })
    .Select(g =>
    {
        var row = dt.NewRow();

        row["Number"] = g.Key.Number;
        row["Type"] = g.Key.Type;
        row["Order"] = g.Key.Order;
        row["Count"] = g.Count();

        return row;

    }).CopyToDataTable();


foreach (DataRow row in dt2.Rows)
{
    for (int i = 0; i < dt2.Columns.Count; i++)
        Console.Write("{0}{1}",
            row[i],                                                    // Print column data
            (i < dt2.Columns.Count - 1)? "  " : Environment.NewLine);  // Print column or row separator

}

以下是结果:
1  1  R  3
1  2  R  1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接