如何使用“分组依据”和“选择”拼合对象
本文关键字:选择 对象 何使用 分组依据 | 更新日期: 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
只有一个Code1
,Code2
和Code3
(。
所以这应该做你想要的:
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
(这将是创建的ObjectB
的Date
(对ObjectA
进行分组,并根据ObjectA
的Value
s和相应的代码设置CodeX
。
所以结果(objectBList
(是一个列表,其中包含每个Date
的ObjectB
,其中包含该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)
});
我正在对每个给定代码的所有值求和,但您可以按照自己的喜好聚合这些值。