【问题标题】:Linq Group by specific day interval?Linq Group按特定的日期间隔?
【发布时间】:2012-11-09 13:23:00
【问题描述】:

我有以下行来分组我的收藏:

group c by new { date = GetGroupingDateKey(DateRangeType, c.ReadDate), name = c.Name } into g

我使用以下函数来获取分组日期键:

private static DateTime GetGroupingDateKey(MeterReadingsTimeIntervals DateRangeType, DateTime Date)
{
    DateTime date = new DateTime();
    switch (DateRangeType)
    {
        case MeterReadingsTimeIntervals.Hourly:
            date = new DateTime(Date.Year, Date.Month, Date.Day, Date.Hour, 0, 0);
            break;
       case MeterReadingsTimeIntervals.Daily:
            date = new DateTime(Date.Year, Date.Month, Date.Day, 0, 0, 0);
            break;
        case MeterReadingsTimeIntervals.Weekly:

            // ???

            break;
        case MeterReadingsTimeIntervals.Monthly:
            date = new DateTime(Date.Year, Date.Month, 1, 0, 0, 0);
            break;
        case MeterReadingsTimeIntervals.Yearly:
            date = new DateTime(Date.Year, 1, 1, 0, 0, 0);
            break;
    }

    return date;
}

但我不知道每周分组(可能是特定的天间隔、10 天、15 天等)。如何每周分组?我应该使用其他方式对数据进行分组吗?

感谢您的建议。

【问题讨论】:

  • 你如何定义“周”? 2012 年 12 月 31 日星期一与 2013 年 1 月 1 日星期二在同一周吗?周日是否与紧随其后的周一在同一周?
  • 旁注:我建议遵循 .net 命名约定,其中参数以小写字母 (camelCase) 开头。
  • @MarkByersweek,星期并不重要。它可能是一个特定的天间隔。(考试:10天,15天)
  • 如果您只想分组为任意大小的天间隔,可以使用 DayOfYear 属性。
  • @JamesGaunt,有代码示例吗?

标签: c# linq datetime group-by


【解决方案1】:

可能是这样的:

date = Date.AddDays(-((Date.DayOfWeek - DayOfWeek.Monday +7)%7));
date = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);

如果您考虑一周的星期一开始。

您可以使用以下代码进行尝试: EDIT 在@Rawling 建议后编辑的代码,检查 cmets

DateTime dt = DateTime.Now;
dt = dt.AddDays(-((dt.DayOfWeek - DayOfWeek.Monday + 7)%7));
dt = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);//today is Friday and it will show Monday at the end.

【讨论】:

  • 这并不认为星期一是一周的开始。它将一天添加到星期日值。
  • 为什么要投反对票?它将始终将日期设置为所需一周的星期一。
  • @Rawling 我试过了,效果很好。你应该自己试试。
  • 不,不会的。如果您有星期天,Date.DayOfWeek0DayOfWeek.Monday1。那么Date.DayOfWeek - DayOfWeek.Monday-1,所以你添加一天到Date。因此它将星期天与下一个星期一存储在一起,从而有效地使星期从星期日开始!
  • No 没关系,我们不应该给出部分正确或错误的答案。最好的声誉不是我们名字旁边的数字,而是我们在这里编写的代码。再次感谢。
【解决方案2】:

使用辅助函数

int DaysFromLast(DateTime date, DayOfWeek dow)
{
    return (7 + date.DayOfWeek - dow) % 7;
}

你可以使用

var date = Date.Date;
date = date.AddDays(-DaysFromLast(date, DayOfWeek.Monday));

从星期一开始的一周,以此类推。

对于任意间隔,您需要一个固定的开始日期(最好是过去);那么

var date = Date.Date;
date = date.AddDays(-((date - startDate).Days % numberOfDaysInInterval));

【讨论】:

  • 我认为这是我所期望的答案。但我无法理解“startDate”。
  • 这是一个属性! (oneDate - anotherDate) 产生 TimeSpanTotalDays property 给出时间跨度的长度(以小数天为单位)。
  • 你可以(在这种情况下)等效地使用Days - 我想我会把它改成这样,所以一切都是一个整数。
【解决方案3】:

星期取决于您使用的日历类型及其规则。有些一年的第一周从一年的第一个星期一开始,有些从星期日开始,等等,存在差异。

例如,您可以使用GregorianCalendar 及其方法GetWeekOfYear(DateTime)。

case MeterReadingsTimeIntervals.Weekly:
  var gc = new GregorianCalendar();
  return gc.GetWeekOfYear(Date);

现在,您必须设置方法对象的返回类型或强制将 weekinfo 设置为相同的 DateTime(将其设置为找到的一周的星期一),

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2018-01-20
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多