c# - 分组和求和数据表

标签 c# asp.net datatable dataset

我有包含以下数据的数据表

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

最佳答案

目标

你的问题让我很好奇,所以我在 Stack Overflow 上做了一些挖掘。
esc's答案出现也将解决您的问题。它张贴在:How do I use SELECT GROUP BY in DataTable.Select(Expression)? :

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

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();

这将返回一个数据表,该数据表将输入数据表的架构与您请求的分组和计数相匹配。

这是我在 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

关于c# - 分组和求和数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57596738/

相关文章:

javascript - 无法使用 dataTable jquery 删除表中新添加的行

C# 如何通过管理员提升的 cmd 运行进程(带参数)

c# - 如何使用 ServiceStack 客户端使用文件

c# - 使用 Microsoft Expression Encoder 自定义捕获大小

c# - ASP.NET 中的 ActiveX 控件

c# - 是否可以将 PDF 作为 HTML 嵌入到电子邮件中?

WPF ListBox - 如何从数据表中输入值?

c# - 如果我使用异步,不应该使用更少的线程数吗?

c# - 创建 View - 使用产品订购

jsf - 在jsf数据表中选择一行