按周分割数据

时间:2013-02-19 21:36:00

标签: c# .net

我有一个带有时间戳的数据对象:

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,但我以前从未使用它,也不知道如何在这种情况下使用它。

2 个答案:

答案 0 :(得分:7)

假设你可以使用LINQ,你只需要:

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

...其中GetStartOfWeek会在给定周的开头返回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 :(得分: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));