2

我有一个DataSet2DataTable的。每个都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
4

2 回答 2

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"]
        );
}
于 2013-01-10T13:09:36.177 回答
0

为了得到结果,你可以做类似的事情

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

这不会给你一个数据表,而是一个 IEnumerable。要将 IEnumerable 转换为 dataTable,请参见此处的示例

或更简单,如果 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"))));
于 2013-01-10T13:02:53.337 回答