0

コレクションをグループ化する次の行があります。

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日など)。毎週グループ化するにはどうすればよいですか? 別の方法でデータをグループ化する必要がありますか?

アドバイスありがとう。

4

3 に答える 3

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.
于 2012-11-09T13:33:25.457 に答える
1

週は、使用しているカレンダーの種類とそのルールによって異なります。年の最初の週が年の最初の月曜日に始まるものもあれば、日曜日に始まるものもありますが、違いがあります。

たとえば、GregorianCalendarとそのメソッド GetWeekOfYear(DateTime)を使用できます。

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

これを機能させるには、メソッド オブジェクトの戻り値の型を作成するか、weekinfo を強制的に同じ DateTime にする必要があります (見つかった週の月曜日に設定します)。

于 2012-11-09T13:27:19.403 に答える
1

ヘルパー機能で

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

あなたが使用することができます

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

月曜日から始まる 1 週間など。

任意の間隔の場合、一定の開始日が必要です (できれば過去にさかのぼる)。それから

var date = Date.Date;
date = date.AddDays(-((date - startDate).Days % numberOfDaysInInterval));
于 2012-11-09T13:31:24.333 に答える