c# - 按日期范围分组,在每个组内计数和排序 LINQ

标签 c# linq

我的对象中存储了一组日期。这是示例数据。实际上,日期将来自服务调用,我不知道返回的日期和数量:

var ListHeader = new List<ListHeaderData>
{
    new ListHeaderData
    {
        EntryDate = new DateTime(2013, 8, 26)
    },
    new ListHeaderData
    {
        EntryDate = new DateTime(2013, 9, 11)
    },
    new ListHeaderData
    {
        EntryDate = new DateTime(2013, 1, 1)
    },
    new ListHeaderData
    {
        EntryDate = new DateTime(2013, 9, 15)
    },
    new ListHeaderData
    {
        EntryDate = new DateTime(2013, 9, 17)
    },
    new ListHeaderData
    {
        EntryDate = new DateTime(2013, 9, 5)
    },
};

我现在需要像这样按日期范围分组:

Today (1) <- contains the date 9/17/2013 and count of 1
within 2 weeks (3) <- contains dates 9/15,9/11,9/5 and count of 3
More than 2 weeks (2) <- contains dates 8/26, 1/1 and count of 2

这是我的 LINQ 语句,它没有达到我的需要,但我认为我在球场上(如果我不在球场上,请善待):

var defaultGroups = from l in ListHeader
                group l by l.EntryDate into g
                orderby g.Min(x => x.EntryDate)
                select new { GroupBy = g };

这按个人日期分组,所以我有 6 个组,每个组有 1 个日期。如何按日期范围分组、在每个组内计数和排序?

最佳答案

引入数组,其中包含您要分组的范围。这是两个范围 - 今天(零天)和 14 天(两周):

var today = DateTime.Today;
var ranges = new List<int?> { 0, 14 };

现在按元素所属的范围对元素进行分组。如果没有合适的范围(所有日期都超过两周),则将使用默认的 null 范围值:

var defaultGroups = 
      from h in ListHeader
      let daysFromToday = (int)(today - h.EntryDate).TotalDays
      group h by ranges.FirstOrDefault(range => daysFromToday <= range) into g
      orderby g.Min(x => x.EntryDate)
      select g;

更新:为分组添加自定义范围:

var ranges = new List<int?>();
ranges.Add(0); // today
ranges.Add(7*2); // two weeks
ranges.Add(DateTime.Today.Day); // within current month
ranges.Add(DateTime.Today.DayOfYear); // within current year
ranges.Sort();

关于c# - 按日期范围分组,在每个组内计数和排序 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18852172/

相关文章:

c# - 计算行尾的出现次数

c# - LINQ 到实体 : cannot call a method

c# - 通用类型检查

c# - 如何防止 xml 将/r/n 转换为

c# - 如何在 winrt 中为圆形路径上的文本设置动画?

c# - LINQ to Object Join 运算符和相等性

c# - 优化 Entity Framework 4.1 中 LINQ Query 生成的具有一对多关联的 SQL

c# - 希望 : Hiding a Deprecated Method with Another Overload Using Default Parameters

c# - 使用 C# LINQ 和 MongoDB 对嵌入/嵌套文档进行子查询或联接

c# - 按字母顺序获取名字在姓氏之前的学生列表