我有一个

List<Advertisement>


其中Advertisement包含

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }


我要做的是使用GroupBy将List<Advertisement>中的元素按三个特定的时间范围进行分组。三个时间范围如下:


x => x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(1))
x => x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(7))
x => x.StartDate > DateTime.Now.Subtract(TimeSpan.FromDays(365))


因此,元素的开始日期在最后一天,元素的开始日期在最后一周,元素的开始日期在去年。

去年的元素组应包括开始日期为最后一周和日期的那些元素。上周的要素应该包括最后一天的要素。

我似乎无法思考如何做到这一点。干杯。

最佳答案

因为您希望每个组也包括以前的组内容(例如,上周包括最后一天),所以我构造了一个联合查询

var today=items.Where(l=>l.StartDate>DateTime.Now.Subtract(TimeSpan.FromDays(1)));
var lastweek=items.Where(l=>l.StartDate>DateTime.Now.Subtract(TimeSpan.FromDays(7)));
var lastyear=items.Where(l=>l.StartDate>DateTime.Now.Subtract(TimeSpan.FromDays(365)));


var result = today.Select(d => new { Group="Last Day",item=d})
                  .Union(lastweek.Select(w => new {Group="Last Week",item=w}))
                  .Union(lastyear.Select(y => new {Group="Last Year",item=y}))
                  .GroupBy (l => l.Group,l=>l.item);


该查询的工作方式是创建3个子查询以选择相关数据。
然后,每个查询都使用选择运算符来选择匹配组名称和投影到匿名对象中的原始项目。 (基本上创建一个新对象,将组名作为一个属性,将原来的Item作为另一个属性)。
然后,我使用并集将多个结果合并到一个大列表中。 (Union具有删除重复项的附加属性,但不应有任何重复项)。一旦有了大列表,便可以按组名进行分组,第二个参数基本上将原始项目作为组值放回去。

关于c# - 在LINQ中按特定时间范围分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6827381/

10-10 10:48