Группировать несколько свойств даты по месяцу и году в LINQ
Мне нужно сгруппировать по нескольким свойствам по месяцам и годам в C#
LINQ
Это мой код:
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
};
Мой требуемый результат, чтобы быть таким
MONTH YEAR COUNT
OCT 2012 2
NOV 2012 3
DEC 2012 2
Помоги мне
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
ссылки вы можете использовать сделать ответ Ивана чище с помощью 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 });
Это может вам IEnumerable<KeyValuePair<TKey, int>>
где TKey
это анонимный тип с Year
а также Month
и int
это количество