【问题标题】:Using Linq to GroupBy and Sum datatable使用 Linq 到 GroupBy 和 Sum 数据表
【发布时间】:2016-06-01 17:27:44
【问题描述】:

您好,我有一个这样的数据表:

编号 金额 1 金额 2 金额 3 1 2 2 2 12 4 6 4 12 6 6 5 22 7 2 1 22 7 2 2

我需要像这样获取我的数据表:

编号 金额 1 金额 2 金额 3 1 2 2 2 12 10 12 9 22 14 4 3

我最初尝试在匿名方法中执行此操作,但我需要将其返回到另一个无法使用匿名方法完成的类。 我的第二次尝试是这样做,以便可以将其退回:

DataTable ddt = dt.AsEnumerable()
        .Sum(g => g.Field<int>("Amount 1"))
        .GroupBy(g => new { Col1 = g["ID"] })
        .Select(g => g.OrderBy(r => r["ID"]).First())
        .CopyToDataTable();

此代码肯定不会编译,但如果可能的话,任何帮助/建议将不胜感激。我对 linq 很陌生。

【问题讨论】:

  • 如果使用得当,google 可以成为你最好的朋友
  • 您需要先进行分组,然后在您的选择中进行每个总和。

标签: c# linq datatable group-by sum


【解决方案1】:

您可以先GroupBy,然后将组投影到DataRows,然后使用CopyToDataTable 扩展创建DataTable

var newDt = dt.AsEnumerable()
              .GroupBy(r => r.Field<int>("Id"))
              .Select(g =>
              {
                  var row = dt.NewRow();

                  row["Id"] = g.Key;
                  row["Amount 1"] = g.Sum(r => r.Field<int>("Amount 1"));
                  row["Amount 2"] = g.Sum(r => r.Field<int>("Amount 2"));
                  row["Amount 3"] = g.Sum(r => r.Field<int>("Amount 3"));

                  return row;
              }).CopyToDataTable();

【讨论】:

  • 嗨,我使用了这段代码,但它清空了 dt 表,只保留添加的行?!
  • 您好,此解决方案适用于 Android 和 windows 构建,但是当我为 iOS 构建时,它会抛出 Not Supported Exception,如本问题所述。System.Data throws NotSupportedException on iOS Unity Build 您能否回答这个问题
【解决方案2】:

您的电话打错了。下面的代码不会将数据放入表中,但它会为您提供可以轻松放入表中的数据。

dt.AsEnumberable()
    .GroupBy(g => g["ID])
    .Select(g => new {
        Id = g.Key, 
        Amount1 = g.Sum(s => s.Amount1), 
        Amount2 = g.Sum(s => s.Amount2), 
        Amount3 = g.Sum(s => s.Amount3)});

【讨论】:

    【解决方案3】:

    这对我有用。如果您有十进制值并将数据表用作数据表而不是变量,则对 Arturo 的代码稍作更改以帮助解决转换问题。 (请注意,r[15] 是您要求和的列)

                      dt = dt.AsEnumerable()
                        .GroupBy(r => r["fldReportCode"])
                        .Select(g =>
                         {
                            var row = dt.NewRow();
    
                          row["fldReportCode"] = g.Key;
                          row[15] = g.Sum(r => (decimal)r[15]);
                          //row["Amount 2"] = g.Sum(r => r.Field<int>("Amount 2"));
                          //row["Amount 3"] = g.Sum(r => r.Field<int>("Amount 3"));
    
                              return row;
                          }).CopyToDataTable();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2011-03-25
      • 1970-01-01
      • 2016-06-17
      • 2019-09-26
      相关资源
      最近更新 更多