【问题标题】:Add columns of datatables in a dataset在数据集中添加数据表列
【发布时间】:2013-01-10 12:53:04
【问题描述】:

我有一个 DataSet 和 2 个 DataTable。每个DataTable 都包含一个名为“成本”的列。 我想计算一个名为 Result table 的表中 2 个表的所有成本的总和,如下例所示。我该怎么做?

Table 1
Name  | cost
balan |  6
gt    |  5

Table 2
Name  |  cost
balan |  2
gt    |  8

Result table
Name  | cost
balan | 8
gt    | 12

【问题讨论】:

    标签: c# datatable dataset


    【解决方案1】:

    这是一种方法:

    DataTable dt1 = new DataTable();
    DataTable dt2 = new DataTable();
    DataTable results = new DataTable();
    
    dt1.Columns.Add("Name");
    dt1.Columns.Add("cost", typeof(int));
    dt2.Columns.Add("Name");
    dt2.Columns.Add("cost", typeof(int));
    results.Columns.Add("Name");
    results.Columns.Add("cost", typeof(int));
    
    dt1.Rows.Add("balan", 6);
    dt2.Rows.Add("balan", 2);
    dt1.Rows.Add("gt", 5);
    dt2.Rows.Add("gt", 8);
    
    
    foreach (DataRow dr1 in dt1.Rows)
    {
        results.Rows
            .Add(
                dr1["Name"], 
                (int)dr1["cost"] + (int)dt2.Select(String.Format("Name='{0}'", dr1["name"]))[0]["cost"]
            );
    }
    

    【讨论】:

      【解决方案2】:

      要获得结果,您可以执行以下操作

      var table1 = yourDataSet.Tables["Table 1"];
      var table2 = yourDataSet.Tables["Table 2"];
      
      var results = table1.AsEnumerable().Select(t1 => new {
                        name = t1.Field<string>("Name"),
                        cost = t1.Field<int>("cost")
                    })
                    .Concat(
      
                    table2.AsEnumerable().Select(t2 => new {
                        name = t2.Field<string>("Name"),
                        cost = t2.Field<int>("cost")
                    })
                    )
                    .GroupBy(m => m.name)
                    .Select(g => new {
                       name = g.Key,
                       cost = g.Sum(x => x.cost)
                    });
      

      这不会给你一个dataTable,而是一个IEnumerable。要将 IEnumerable 转换为 dataTable,请参见例如 here

      或者更简单,如果 table1 和 table2 有相同的行

      var table1 = yourDataSet.Tables["Table 1"];
      var table2 = yourDataSet.Tables["Table 2"];
      
      var results = new DataTable();
      
      results.Columns.Add("Name");
      results.Columns.Add("cost", typeof(int));
      
      table1.AsEnumerable().Concat(table2.AsEnumerable())
                      .GroupBy(m => m.Field<string>("Name"))
                      .Select(g => results.Rows.Add(g.Key, g.Sum(x => x.Field<int>("cost"))));
      

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多