如何查找列的不同值并查找另一列的相同值的总和?

时间:2017-11-08 16:03:33

标签: c# winforms linq datatable

在我的c#WinForm应用程序中,我有一个DataTable跟踪水果的销售情况,它就像:

/*TableA*/
Name | QuantitySold
Apple | 5
Orange | 10
Apple | 3
Grape | 2
Banana | 6
Orange | 7
Apple | 2
Grape | 2

现在我想用相同的水果名称过滤它们并获得同时售出的每个水果的总和,创建一个新的结果DataTable,它应该看起来像是

/*TableB*/
Name | TotalSold
Apple | 10
Orange | 17
Grape | 4
Banana | 6

我怎么能实现这个目标?

我找到了不同水果名称的数量
int distinctCt = TableA.AsEnumerable()
               .Select(row=>row.Field<string>("Name"))
               .Distinct().Count();

但我意识到这不会从这里开始。 有人可以告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:1)

使用GroupBySum

var nameGroups = TableA.AsEnumerable().GroupBy(r => r.Field<string>("Name"));
var TableB = TableA.Clone();
TableB.Columns["QuantitySold"].ColumnName = "TotalSold";

foreach(var g in nameGroups)
{
    TableB.Rows.Add(g.Key, g.Sum(r => r.Field<int>("QuantitySold")));
}

答案 1 :(得分:0)

你需要使用GroupBy,试试这个:

var x = TableA.AsEnumerable()
        .GroupBy(r=>r.Field<string>("Name"))
        .Select(sm => new 
            {
                Name = sm.First().Field<string>("Name"),
                QuamtitySold = sm.Sum(q => q.Field<int>("QuantitySold"))
            });