如何使用“分组依据”和“选择”拼合对象

本文关键字:选择 对象 何使用 分组依据 | 更新日期: 2023-09-27 17:53:03

我有一个 ObjectA 的集合

 class ObjectA{
   public  DateTime date {get; set;}
   public  int  Code  {get; set;}
   public  decimal Value {get; set;}
    }

List<ObjectA> objectAList = GetObjectAList();

有3种不同的代码。

 class ObjectB{
   public DateTime Date {get;set;}
   public decimal Code1 {get;set;}
   public decimal Code2 {get;set;}
   public decimal Code3 {get;set;}
    }

我想将对象 A 的列表扁平化为对象 B 的列表

我尝试通过使用Groupby来执行此操作,但没有成功:

objectAList .GroupBy (l => l.Code).Select (l => new {
       Code1 = l.Where (x => x.Code== 1).Select (x => x.Value ),
       Code2 = l.Where (x => x.Code== 2).Select (x => x.Value ),
       Code3 = l.Where (x => x.Code== 3).Select (x => x.Value )
    });

但是不确定如何从此查询中获取日期并将其附加到 ObjectA 中?

如何使用“分组依据”和“选择”拼合对象

如果我理解正确,你想创建一个ObjectB实例的集合,每个Date都有ObjectB的实例,包含这个Date的三个CodeX属性的Value(假设每个Date只有一个Code1Code2Code3(。

所以这应该做你想要的:

var objectBList = objectAList.GroupBy(a => a.Date)
          .Select(group => new ObjectB{
               Date = group.Key,
               Code1 = group.FirstOrDefault(g => g.Code == 1)?.Value ?? 0,
               Code2 = group.FirstOrDefault(g => g.Code == 2)?.Value ?? 0,
               Code3 = group.FirstOrDefault(g => g.Code == 3)?.Value ?? 0})
          .ToList();

这将按Date(这将是创建的ObjectBDate(对ObjectA进行分组,并根据ObjectAValue s和相应的代码设置CodeX

所以结果(objectBList(是一个列表,其中包含每个DateObjectB,其中包含该Date的三行的Value


如果每个Date有多个CodeX,则可能需要聚合这些Value。 Juharr为此提供了一个例子。

看起来您希望列表中的每个唯一Date都有一个ObjectB,因此您应该按该进行分组

objectAList .GroupBy (l => l.Date)
            .Select (l => new ObjectB 
            {
                Date = l.Key.Date,
                Code1 = l.Where(x => x.Code == 1).Sum(x => x.Value),
                Code2 = l.Where(x => x.Code == 2).Sum(x => x.Value),
                Code3 = l.Where(x => x.Code == 3).Sum(x => x.Value)
            });

我正在对每个给定代码的所有值求和,但您可以按照自己的喜好聚合这些值。