LINQ - 通过也是List <T>的属性对List <T>进行分组

Jus*_*son 2 c# linq group-by

public class Product {
    public List<DateTime> FailureDates { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个List<Product>,然后我正在尝试进行基于a的分组List<DateTime>在图表中使用.分组应该基于DateTime对象的Year.所以我希望最终结果看起来像:

按年度总失败率

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());
Run Code Online (Sandbox Code Playgroud)

但是,现在DateTime是一个List,所以我不确定如何对它进行分组.我认为合并需要为此工作,所以也许LINQ代码最终会变得太乱,我会更好地使用非LINQ解决方案(例如迭代我的产品然后迭代我的日期和建立一个字典来跟踪计数).

Adu*_*cci 8

这对你有用.

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(),
            }
Run Code Online (Sandbox Code Playgroud)

或者要使用您的示例,只需在此类产品上添加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());
Run Code Online (Sandbox Code Playgroud)