我有一个带有时间戳的数据对象:
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,但我以前从未使用它,也不知道如何在这种情况下使用它。
答案 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));