gpt4 book ai didi

c# - 数据表按总和分组

转载 作者:行者123 更新时间:2023-11-30 15:35:07 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com