Grouping multiple date properties by month and year in LINQ

I need to group by several properties by month and year in C# LINQ

This is my code:

 public class Class1 { public Nullable<DateTime> dt1 { get; set; } public Nullable<DateTime> 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<Class1> listGoogleTimezone = new List<Class1> { obj1, obj2, obj3, obj4, obj5, obj6 }; 

My required result would be like this:

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

help me

+5
source share
2 answers

You need to collect all the dates using SelectMany (in this particular case, filter null values), and then do a typical GroupBy / Count projection:

 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(); 
+4
source

If you have MoreLinq , you can use make Ivan answer cleaner using CountBy :

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

It could be IEnumerable<KeyValuePair<TKey, int>> , where TKey is an anonymous type with Year and Month , and int is an account.

+2
source

Source: https://habr.com/ru/post/1261711/


All Articles