如何使用GroupBy和Select来展平Object

时间:2016-06-29 14:55:47

标签: c#

我有一个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?

2 个答案:

答案 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的三个CodeXDate的{​​{1}}属性(假设只有一个 Code1Code2Code3Date

所以这应该做你想要的:

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 DateDate进行分组(这将是创建的ObjectB的{​​{1}}),并根据{CodeX设置Value具有相应代码的ObjectA个{1}}。

因此,结果(objectBList)是一个包含每个ObjectB的{​​{1}}的列表,其中包含Date的三行中的Value

如果每个Date有多个CodeX,您可能希望汇总这些Datejuharr为此提供了一个示例。