如何用LINQ实现指定条件下嵌套子类列表的按日期分组汇总?
用LINQ实现MasterClass的subClass汇总需求
我来帮你搞定这个汇总需求,用LINQ可以很简洁地实现,咱们一步步拆解:
首先先确认下类的定义(和你描述的一致):
public class MasterClass { public string A { get; set; } public string B { get; set; } public List<subClass> list { get; set; } } public class subClass { public DateTime date { get; set; } public int NetChange { get; set; } public int Shares { get; set; } public int HeldPerc { get; set; } }
接下来是核心的LINQ实现代码,假设你的原始数据列表是List<MasterClass> masterList:
var aggregatedResult = new MasterClass { A = "1", B = "1/2", list = masterList // 第一步:筛选出所有A属性为"1"的MasterClass .Where(master => master.A == "1") // 第二步:把所有符合条件的subClass列表扁平化为一个集合 .SelectMany(master => master.list) // 第三步:按date字段分组(如果需要忽略时分秒,改成sc => sc.date.Date) .GroupBy(sub => sub.date) // 第四步:对每个分组的数值字段求和,生成新的subClass对象 .Select(group => new subClass { date = group.Key, NetChange = group.Sum(sub => sub.NetChange), Shares = group.Sum(sub => sub.Shares), HeldPerc = group.Sum(sub => sub.HeldPerc) }) // 最后转换成List<subClass>赋值 .ToList() };
代码逐步解释:
- 筛选数据:
Where(master => master.A == "1")只保留A属性为"1"的MasterClass,避免处理无关数据; - 扁平化列表:
SelectMany(master => master.list)把多个MasterClass各自的subClass列表合并成一个大的subClass集合,这样才能统一分组; - 按日期分组:
GroupBy(sub => sub.date)将同一日期的subClass记录归为一组;如果你的date字段包含时分秒但只需要按年月日汇总,把key改成sub.date.Date即可; - 汇总计算:对每个分组,用
Sum方法分别计算NetChange、Shares、HeldPerc的总和,生成新的subClass对象存储结果; - 转换列表:最后用
ToList()把汇总后的结果转换成List,赋值给新MasterClass的list属性。
如果没有找到A="1"的MasterClass,那么汇总后的list会是空列表,这也是符合预期的行为。
内容的提问来源于stack exchange,提问作者Soren Schreiber
相关产品推荐
相关产品推荐

