我有一个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的列表展平为ObjectB的列表
我尝试使用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?
答案 0 :(得分:1)
您的列表中的每个唯一ObjectB
似乎都需要一个Date
,因此您应该将其分组
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)
});
我总结了每个给定代码的所有值,但您可以按照自己喜欢的方式汇总值。
答案 1 :(得分:1)
如果我理解正确,您希望创建一个ObjectB
个实例的集合,每个ObjectB
的实例为Date
,其中包含Value
的三个CodeX
此Date
的{{1}}属性(假设只有一个 Code1
,Code2
和Code3
每Date
)
所以这应该做你想要的:
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();
这会根据ObjectA
Date
对Date
进行分组(这将是创建的ObjectB
的{{1}}),并根据{CodeX
设置Value
具有相应代码的ObjectA
个{1}}。
因此,结果(objectBList
)是一个包含每个ObjectB
的{{1}}的列表,其中包含Date
的三行中的Value
个
如果每个Date
有多个CodeX
,您可能希望汇总这些Date
。 juharr为此提供了一个示例。