2016-12-22 50 views
5

muszę grupy przez wielu właściwości przez miesiąc i rok w C#LINQGroupBy stwardnienie data właściwości przez miesiąc i rok w LINQ

To jest mój kod:

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 wymagany wynik tak być

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

Pomóż mi

+0

Której z dwóch dat chcesz grupować według? Na wyjściu jest tylko jedna data, ale dwie na wejściu. – Robba

+0

Potrzebuję obu właściwości daty do pogrupowania według –

+0

A gdzie jest twój problem? 'result = list.GroupBy (x => new {x.dt1, x.dt2})'. – HimBromBeere

Odpowiedz

4

Musisz zebrać wszystkie daty użyciu SelectMany (w tym konkretnym przypadku odfiltrować wartości null), a następnie wykonać typowe GroupBy/Count projekcji:

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(); 
2

Jeśli masz MoreLinq odwoływać można użyć uczynić odpowiedź czystsze Ivan „s za pomocą 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 }); 

To będzie można IEnumerable<KeyValuePair<TKey, int>>, gdzie TKey jest anonimowy z Year i Month i int jest liczbą.