C# 如何使用GroupBy和Select展平对象

C# 如何使用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

我有一套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来实现这一点,但没有成功:

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
呃日期。