c# - 如何使用 Linq 对列表进行分组和求和
问题描述
我有一个包含每小时对象的列表列表。我需要通过按小时分组并将点击次数和块数相加,将所有列表归为一个。我使用 for 循环编写了代码,但想知道如何使用 Linq 来完成。
class hourly
{
public int clicks { get; set; }
public int blocks { get; set; }
public int hour { get; set; }
}
var m = new List<List<hourly>>();
/// populate m from DB
var n = new List<hourly>(24);
for (int i = 0; i < 24; i++)
{
n.Add(new hourly());
n[i] = new hourly() { hour = i, clicks = m.Sum(x => x[i].clicks), blocks = m.Sum(x => x[i].blocks) };
}
解决方案
我想你正在寻找SelectMany
和GroupBy
:
var result = m
.SelectMany(ll => ll)
.GroupBy(h => h.hour)
.Select(g => new hourly
{
hour = g.Key,
blocks = g.Sum(h => h.blocks),
clicks = g.Sum(h => h.clicks)
})
.ToList();
如果您的数据库中在某个具体小时内没有实例,hourly
并且您需要在最终结果中包含所有实例,则可以在 之后添加虚拟SelectMany
实例,例如:
.Concat(Enumerable.Range(0, 24).Select(i => new hourly {hour = i}))
如果订购很重要OrderBy
,请先申请ToList
。
推荐阅读
- go - 将 swaggo/http-swagger 与 julienschmidt/httprouter 一起使用时出现空白页
- jmeter - 在“查看结果树”的第二个循环中,采样器名称将为空/空白
- gtk3 - 在 Glade 中动态添加对象/子项
- node.js - React Native 错误:'react-native' 未被识别为内部或外部命令、可运行程序或批处理文件
- reactjs - 为什么我的输入组件中的 setSetsValue 没有增加?
- android - 来自深度链接意图时如何仅打开 1 个 android 应用程序实例?
- python - 在图像上使用 pixellib 自定义训练时出现 input_image_meta 形状错误
- r - geom_sf:使用 expand=FALSE 重新标记经纬网
- substring - 在线性时间内选择字符串中具有最大点的 2mers
- java - 使用 java forEach 进行图节点父更新