c# - Linq - 项目列表 <A> 到分组列表 <B> 与列表 <B> 中的 C 对象

标签 c# .net linq grouping

我有这样的类(class):

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; }
}

我有一个 List<A>其中包含一系列日期,每个日期都有小时值。我正在尝试将它从那种格式转换为 B 类型的格式,所以 List<B> .

例如,如果 List<A> 中有 3 天的数据(即 24 x 3 = 72 条记录),那么 List<B> 中应该有 3 个 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 
                  }
              }
          });

但它返回一个没有日期分组的列表。我不确定如何建立该分组。非常感谢任何帮助!

最佳答案

从逻辑上讲,您的 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# - Linq - 项目列表 <A> 到分组列表 <B> 与列表 <B> 中的 C 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392433/

相关文章:

c# - 如何更新现有的共享文件夹属性?

c# - 没有字典的快速多键查找?

c# - 如何将 Controller 用于局部 View ?

.net - 如何设计可由多个端点使用的 Web 服务 (microsoft)?

.net - 是否有 .Net string.IsNullOrWhiteSpace() 的 VBscript 等效项?

c# - EntityFramework 无法创建类型为 'Anonymous type' 的常量值。在此上下文中仅支持原始类型或枚举类型

c# - 选择第一个记录每个组

c# - 在接口(interface)签名相同的接口(interface)之间转换

c# - 在没有预览 View 或 cameraUI 的情况下捕获网络摄像头图像?

c# - 如何为 OpenFileDialog 框中的取消按钮编写代码