C# 如何使用GroupBy和Select展平对象
我有一套ObjectAC# 如何使用GroupBy和Select展平对象,c#,C#,我有一套ObjectA class ObjectA{ public DateTime date {get; set;} public int Code {get; set;} public decimal Value {get; set;} } List<ObjectA> objectAList = GetObjectAList(); 我想将对象A的列表展平为对象B的列表 我尝试使用GroupBy来实现这一点,但没有成功: objectAL
class ObjectA{
public DateTime date {get; set;}
public int Code {get; set;}
public decimal Value {get; set;}
}
List<ObjectA> objectAList = GetObjectAList();
我想将对象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
,因此您应该按该日期分组
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)
});
我正在对每个给定代码的所有值求和,但您可以根据自己的喜好对值进行聚合。看起来您希望列表中每个唯一的日期都有一个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)
});
我正在对每个给定代码的所有值求和,但您可以按自己的喜好聚合这些值。如果我理解正确,您希望创建一个ObjectB
实例的集合,其中每个日期都有ObjectB
的实例,包含此日期
的三个CodeX
属性中的值
(假设每个日期
只有一个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();
这将根据对象A
的日期(即创建的对象B
的日期
)对对象A
进行分组,并根据对象A
的值和相应的代码设置代码
因此结果(objectBList
)是一个列表,其中包含每个日期的ObjectB
,其中包含该日期的三行值
如果每个Date
有多个CodeX
,您可能希望将这些值聚合起来。提供了一个例子。如果我理解正确,您希望创建一个ObjectB
实例集合,其中每个日期都有ObjectB
实例,其中包含此日期的三个CodeX
属性的值(假设每个<代码>日期<代码>只有一个<代码>代码1
,<代码>代码2
和<代码>代码3
)
所以这应该是你想要的:
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();
这将根据对象A
的日期(即创建的对象B
的日期
)对对象A
进行分组,并根据对象A
的值和相应的代码设置代码
因此结果(objectBList
)是一个列表,其中包含每个日期的ObjectB
,其中包含该日期的三行值
如果每个Date
有多个CodeX
,您可能希望聚合这些值。提供了一个示例。您选择哪个日期?哪个日期优先?您不应该按Date
分组,然后以某种方式选择代码值吗?我肯定应该按日期分组。是的。但是如何分组呢。我无法将一些示例数据和预期结果分组两次。您似乎误解了GroupBy
GroupBy(l=>l.code)
导致枚举具有相同代码的对象A
,因此中的不再有意义了…每个日期的代码是否唯一?您选择哪个日期?哪个日期优先?您不应该按日期分组然后选择代码v吗不知何故,值?我肯定应该按日期分组。是的。但是如何分组。我不能分组两次。一些示例数据和预期结果会有所帮助。似乎您误解了GroupBy
GroupBy(l=>l.code)
导致枚举具有相同code
的对象a
,因此中的不再有意义了…每个日期的code
是唯一的吗?为什么我需要使用Sum?我不想聚合值。我只想将每个数据展平。基本上从r开始ows至columns@akd在这种情况下,如果您知道每个日期有一个代码,您可以使用FirstOrDefault
。为什么我需要使用Sum?我不想聚合值。我只想将每个数据展平。基本上是从行到行columns@akd在这种情况下,如果您知道有一个代码p,您可以使用FirstOrDefault
呃日期。