【问题标题】:How to concatenate two IEnumerable's and project them into a grouping如何连接两个 IEnumerables 并将它们投影到一个分组中
【发布时间】:2015-12-14 14:09:47
【问题描述】:

我有两个IEnumerable<StatusGroup>,其中StatusGroup 喜欢

public class StatusGroup
    {
        public DateTime ExamDate{ get; set; }
        public int SuccessCount{ get; set; }
        public int FailCount{ get; set; }
    } 

我想合并两个 IEnumerable,所以结果每个日期只有一条记录,并且应该计算计数器属性的总和

例如

List1={Date= 01/01/2016 , Success=10, Fail=0}
List2={Date= 01/01/2016 , Success=0, Fail=3}

结果应该是

List2={Date= 01/01/2016 , Success=10, Fail=3}

【问题讨论】:

  • GroupBy(x => x.Date).Select(x => new StatusGroup { Date = x.Key, Success = x.Sum(y => y.Success) ... })
  • 各个列表中是否可以有重复的日期,或者每个列表中的每个日期是否唯一?

标签: c# entity-framework linq ienumerable


【解决方案1】:

您可以进行 Concat/Union,然后按日期分组。代码大致如下所示:

var list3 = List1.Concat(List2)
                             .GroupBy(x => x.Date)  
                             .Select(grouping => 
                                 new StatusGroup
                                 {
                                     Date = grouping.Key, 
                                     SuccessCount = grouping.Sum(x => x.SuccessCount), 
                                     FailCount = grouping.Sum(x => x.FailCount)
                                 });

【讨论】:

  • 不要使用UnionUnion 删除重复项,这会给您错误的总和。使用Concat
  • @hvd 对于结构,是的,但不是类 - 当然,除非它们覆盖了 Equals 方法(并且在 this 情况下的重复类似乎是错误的我)。虽然你的观点仍然有效。
  • @Rob 取决于班级。是否覆盖EqualsGetHashcode
  • 您可能还想使用.GroupBy(x => x.ExamDate.Date) 来忽略时间部分。听起来好像 OP 想要每个日期都有一个对象(不是DateTime)。
  • @Rob 使用Union 的目的仍然是删除重复项,无论它是否真的这样做。因此,如果打算保留重复项,则不应使用 union
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
相关资源
最近更新 更多