嗨,我有这样的数据表:
Id Amount 1 Amount 2 Amount 3 1 2 2 2 12 4 6 4 12 6 6 5 22 7 2 1 22 7 2 2
我需要像这样得到我的数据表:
Id Amount 1 Amount 2 Amount 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很新。
答案 0 :(得分:17)
您可以先GroupBy
,然后将群组投放到DataRow
,然后使用DataTable
扩展程序创建CopyToDataTable
:
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();
答案 1 :(得分:1)
这对我有用。如果您具有十进制值并且使用数据表作为数据表而不是变量,则对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();
答案 2 :(得分:0)
您的通话无序。下面的代码不会将数据放入表中,但它会为您提供可以轻松放入表中的数据。
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)});