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

在主要方法中,我在 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 天的数据单独放在另一个数组中。

我需要创建某种二维列表,并以某种方式将数据划分为“数组数组”,但我很难过。我怀疑我需要使用 List.FindAll 但我以前从未使用过它,也不知道在这种情况下如何使用它。

4

2 回答 2

7

假设您可以使用 LINQ,您只需要以下内容:

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

... where将在给定周开始时GetStartOfWeek返回 a ,例如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);
}

这会给你一个以星期日为基础的一周。您需要对其进行一些调整,以考虑从周六、周一或其他任何时间开始的一周。

于 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 回答