c# - 数据表按总和分组

标签 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 会使过程比嵌套循环更快吗?

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

最佳答案

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

您需要实现 CopyToDataTable 方法,其中 Generic Type T Is Not a DataRow .


一个稍微优化的解决方案(单一解析和单一循环分组等级):

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

关于c# - 数据表按总和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333368/

相关文章:

c# - ToolStrip.Background 仅更改按钮的背景 (C#/.NET/WinForms)

c# - 在我的.net程序运行时仍要处理奇怪的错误吗?

javascript - 数据表不允许将多个页脚行包含到导出的 pdf 文件中

c# - 在 C# 中将 unicode 字符串写入 csv

c# - 使用 ASP.Net,在这种情况下最好使用什么控件?

c# - 使用 LINQ 生成排列

c# - 如何针对集合调用 Expression<Func<Entity, bool>>

javascript - 如何从 DataTable 中的 GET 请求打开页面?

c# - C#中快速匹配DataTable和String Array的方法

c# - 防止索引超出范围错误