Linq集团按具体日间隔?

时间:2012-11-09 13:23:01

标签: c# linq datetime group-by

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

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天等)。我怎样才能每周分组?我应该使用其他方式对数据进行分组吗?

感谢您的建议。

3 个答案:

答案 0 :(得分:2)

也许是这样的:

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

如果你考虑星期一的星期一开始。

您可以使用以下代码进行尝试: 编辑在@Rawling建议后编辑代码,查看评论

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.

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

使用辅助函数

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));