在LINQ中按月份和年份对多个日期属性进行分组

6

我需要在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

帮我一下


你想按照这两个日期中的哪一个进行分组?输出中只有一个日期,但输入中有两个。 - Robba
我需要同时使用日期属性进行分组。 - Dinesh
你的问题出在哪里?result = list.GroupBy(x => new { x.dt1, x.dt2 }) - MakePeaceGreatAgain
我对LINQ不熟悉,不知道如何按两个日期字段分组。 - Dinesh
1
可能是按多列分组的重复问题。 - basarab
2个回答

5

您需要使用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();

2
如果你引用了 MoreLinq,你可以使用CountBy使得 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<KeyValuePair<TKey, int>>,其中 TKey 是一个带有 YearMonth 的匿名类型,而 int 是计数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接