数据组按总和

时间:2013-03-11 07:33:24

标签: c# linq datatable sum

在队列中我有以下格式的数据表

some table in the Queue
    Name Rank
    AAA  9 
    BBB  5
    CCC  1
    DDD  5

some other table in the Queue
    Name Rank
    AAA  1 
    SSS  5
    MMM  1
    DDD  8

使用LINQ需要不断地逐表处理这些表,并以下列格式将结果添加到全局DataTable中:

Name  Rank1  Rank2  Rank3  Rank>3
AAA   1      0      0      1
BBB   0      0      0      1
CCC   1      0      0      0
DDD   0      0      0      2
SSS   0      0      0      1
MMM   0      0      0      0
全局表中的

4列说明了名称在1,2,3或> 3中排名的次数。

现在如果名称已经存在于全局表中,我将不会添加它,只会增加排名计数列,如果不存在则添加它。

我已经用嵌套循环完成了这个,但我想知道是否有人可以帮助我使用LINQ语法来做这样的事情,还会使用LINQ使进程比嵌套循环更快吗?

请注意,新表每秒都会添加到队列中,我将从队列中获取一些表并将其处理为全局数据表

1 个答案:

答案 0 :(得分:4)

table1.AsEnumerable().Concat(table2.AsEnumerable())
      .GroupBy(r => r.Field<string>("Name"))
      .Select(g => new {
          Name = g.Key,
          Rank1 = g.Count(x => x.Field<int>("Rank") == 1),
          Rank2 = g.Count(x => x.Field<int>("Rank") == 2),
          Rank3 = g.Count(x => x.Field<int>("Rank") == 3),
          OtherRank = g.Count(x => x.Field<int>("Rank") > 3)
      }).CopyToDataTable();

您需要在Generic Type T Is Not a DataRow

中实施CopyToDataTable方法

一个小优化的解决方案(单个解析和分组排名的单循环):

(from row in table1.AsEnumerable().Concat(table2.AsEnumerable())
 group row by row.Field<string>("Name") into g
 let ranks = g.Select(x => x.Field<int>("Rank")).ToList()
 select new {
    Name = g.Key,
    Rank1 = ranks.Count(r => r == 1),
    Rank2 = ranks.Count(r => r == 2),
    Rank3 = ranks.Count(r => r == 3),
    OtherRank = ranks.Count(r => r > 3)        
 }).CopyToDataTable();