【问题标题】:LINQ - Grouping a List<T> by a property which is also a List<T>LINQ - 按也是 List<T> 的属性对 List<T> 进行分组
【发布时间】:2012-04-23 15:56:08
【问题描述】:
public class Product {
    public List<DateTime> FailureDates { get; set; }
}

我有一个List&lt;Product&gt;,然后我尝试根据List&lt;DateTime&gt; 进行分组,以便在图表中使用。分组应该基于 DateTime 对象的年份。所以我希望最终结果看起来像:

按年份划分的故障总数

2012:1,

2011:5,

2010:3

...等等。

在 DateTime 对象变成具有以下代码的列表之前,我最初是这样工作的:

return Json.Encode(Products.Where(s => s.FailureDate != DateTime.MinValue).GroupBy(s => s.FailureDate.Year).Select(s => new { Year = s.Key.ToString(), FailureCount = s.Count() }).ToArray());

但是,现在 DateTime 是一个列表,所以我不确定如何对它进行分组。我认为需要进行合并才能使其正常工作,因此也许 LINQ 代码最终会变得过于混乱,我最好使用非 LINQ 解决方案(例如,遍历我的产品,然后遍历我的日期和建立一个字典来跟踪计数)。

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    这对你有用。

    var query = from p in Products
                from f in p.FailureDates 
                where f != DateTime.MinValue
                group f by f.Year into g
                select new
                {
                  Year = g.Key.ToString(),
                  FailureCount = g.Count(),
                }
    

    或者使用您的示例,只需在这样的产品上添加 SelectMany

    return Json.Encode(Products.SelectMany(p => p.FailureDates)
                               .Where(s => s != DateTime.MinValue)
                               .GroupBy(s => s.Year)
                               .Select(s => new { Year = s.Key.ToString(), FailureCount = s.Count() }).ToArray());
    

    【讨论】:

    • 感谢您的示例,感谢。
    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多