在LINQ中按月和年分组多个日期属性

我需要在C# LINQ按月和按年分组多个属性

这是我的代码:

 public class Class1 { public Nullable dt1 { get; set; } public Nullable dt2 { get; set; } } Class1 obj1 = new Class1 { dt1 = new DateTime(2012, 11, 12), dt2 = new DateTime(2012, 12, 12) }; Class1 obj2 = new Class1 { dt1 = new DateTime(2012, 11, 12), dt2 = new DateTime(2012, 12, 12) }; Class1 obj3 = new Class1 { dt1 = null, dt2 = new DateTime(2012, 10, 12) }; Class1 obj4 = new Class1 { dt1 = new DateTime(2012, 10, 12), dt2 = null }; Class1 obj5 = new Class1 { dt1 = null, dt2 = new DateTime(2012, 11, 12) }; Class1 obj6 = new Class1 { dt1 = new DateTime(2013, 10, 12), dt2 = null }; List listGoogleTimezone = new List { obj1, obj2, obj3, obj4, obj5, obj6 }; 

我要的结果是这样的

 MONTH YEAR COUNT 
 OCT 2012 2 NOV 2012 3 DEC 2012 2 

帮帮我

您需要使用SelectMany收集所有日期(在此特定情况下过滤掉null值),然后执行典型的GroupBy / Count投影:

 var result = listGoogleTimezone .SelectMany(x => new[] { x.dt1, x.dt2 }.Where(dt => dt != null).Select(dt => dt.Value)) .GroupBy(dt => new { dt.Month, dt.Year }) .OrderBy(g => g.Key.Year).ThenBy(g => g.Key.Month) // optional .Select(g => new { g.Key.Month, g.Key.Year, Count = g.Count() }).ToList(); 

如果你引用了MoreLinq你可以使用MoreLinq使用make Ivan的答案清理:

 var result = listGoogleTimezone .SelectMany(x => new[] { x.dt1, x.dt2 } .Where(dt => dt != null) .Select(dt => dt.Value)) .CountBy(x => new { Year = x.Year, Month = x.Month }); 

这将是IEnumerable> ,其中TKey是具有YearMonth的匿名类型, int是计数。