使用 LINQ,将 List<A> 投影为带有 C 对象的分组 List<B>。

3

我有一些类似这样的课程:

public class A {
    public DateTime Date { get; set; }
    public int Hour { get; set; }
    public decimal Value { get; set; }
}

public class B {
    public DateTime Date { get; set; }
    public C C { get; set; }
}

public class C {
    public int Hour { get; set; }
    public decimal Value { get; set; }
}

我有一个包含许多日期和每小时数值的列表,我想将其从该格式转换为B类型的List & lt;B & gt;

例如,如果List & lt;A & gt;中有三天的数据(即24 x 3 = 72条记录),则应该在List & lt;B & gt;中有三个B类型的对象 - 每个对象代表一天的数据,其中24个小时被分割成C类型。

我知道可以使用嵌套的foreach循环来完成这个任务,但我认为使用LINQ会更加优雅,并且在性能上也可能更好。

我正在尝试的代码是:

var res = from a in AList
          select (new List<B>
          {
              new B
              {
                  Date = a.Date,
                  C = new C() 
                  { 
                      Hour = a.Hour, 
                      Value = a.Value 
                  }
              }
          });

但是它返回的列表没有日期分组。我不确定如何建立这个分组。希望得到任何帮助!

你可以使用 group a by a.Date into bgroup 来进行分组,然后通过 from b in bgroup select new B { Date = bgroup.Key, new C(b.Hour, b.Value) } 进行选择,而不是直接从 a 中选择 b。 - zahir
请查看网页:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b - jdweng
2个回答

2

从逻辑上讲,你的B类应该包含一个集合,其中包含C实例:

public class B {
    public DateTime Date { get; set; }
    public ICollection<C> C { get; set; }
}

因此,您可以使用group by来填充这些实例:
var res = 
(
    from a in AList
    group a by a.Date into g
    select new B
    {
        Date = g.Key,
        C = 
        (
            from c in g
            select new C
            { 
                Hour = c.Hour, 
                Value = c.Value 
            }
        ).ToList()
    }
).ToList();

谢谢指出,你说得对。我需要一个 C 集合,真不敢相信我错过了这个。+1 - RizJa

1
        var newAList = from a in AList
                       select new B 
                       { 
                           Date = a.Date,
                           C = new C { Hour = a.Hour, Value = a.Value }
                       };

LINQ:优雅?是的。但比嵌套循环更好的性能?我不确定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接