2

タイムスタンプを持つデータオブジェクトがあります。

class MyDataObject
{
    public DateTime timestamp { get; set; }
    public int value { get; set; }

    public MyDataObject(DateTime timestamp, int value)
    {
        this.timestamp = timestamp;
        this.value = value;
    }
}

mainメソッドでは、18日(2.5週間)の期間にわたってこれらのデータオブジェクトを多数作成します。

    static void Main(string[] args)
    {
        List<MyDataObject> data = new List<MyDataObject>();

        data.Add(new MyDataObject(DateTime.Now, 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(2), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(4), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(6), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(8), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(10), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(12), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(14), 1));
        data.Add(new MyDataObject(DateTime.Now.AddDays(18), 1));
    }

このデータを週で割る必要があります。そのため、1日目から6日目までのデータを配列に配置し、8日目から14日目までのデータを別の配列に配置し、18日目のデータをすべて単独で別の配列に配置する必要があります。

ある種の2Dリストを作成し、データを「配列の配列」に分割する必要がありますが、困惑しています。List.FindAllを使用する必要があると思いますが、これまで使用したことがなく、この場合にどのように使用できるかわかりません。

4

2 に答える 2

7

LINQ を使用できると仮定すると、次のようなものが必要になります。

var groupedByWeek = data.GroupBy(item => GetStartOfWeek(item.timestamp));

...指定された週の開始時にGetStartOfWeeka を返す場所、たとえばDateTime

public static DateTime GetStartOfWeek(DateTime value)
{
    // Get rid of the time part first...
    value = value.Date;
    int daysIntoWeek = (int) value.DayOfWeek;
    return value.AddDays(-daysIntoWeek);
}

これにより、日曜日ベースの週が得られます。土曜日、月曜日などから始まる 1 週間を考慮するには、少し調整する必要があります。

于 2013-02-19T21:41:29.573 に答える
2

最初に行うことは、指定されたタイムスタンプの週番号を取得することです。まあ、GetWeekOfYearメソッドはまさにそれを行うように設計されています。また、LINQ のGroupBy拡張メソッドを使用すると、リストを異なる週に分割するのは非常に簡単です。

using System.Globalization; // for Calendar
using System.Linq; // for GroupBy

...

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar
var groups = data.GroupBy(x => cal.GetWeekOfYear(
    x.timestamp, dfi.CalendarWeekRule, dfi.FirstDayOfWeek));
于 2013-02-19T21:41:36.410 に答える