Parallel.For日期时间
问题描述:
确定此代码是有点元,但它大致说明了我现在如何以及我想实现什么。Parallel.For日期时间
specialObject{
DateTime date;
int number;
}
var startDate = Lowest date in the list;
var endDate = Hightest date int the list;
List<SpecialObject> objs = (list from database where date > startDate and date < endDate)
//A list with alot of dates and numbers, most of the dates are the same. List contains roughly 1000 items, but can be more and less.
for(var date = startDate; date < endDate; date = date.AddDay(1){
listItem = objs.Where(x => x.Day = date).Sum(x => x.alotOfNUmbers);
}
现在因为我不在乎我第一天算什么日子,我以为我可以做到这一点。
Parallel.For(startDate, endDate, day => {
listItem = objs.Where(x => x.Day = date).Sum(x => x.alotOfNUmbers);
}
但是,我如何使它步骤日期?
答
你可以让一个范围,并遍历它Parallel.ForEach:
// not tested
var days = Enumerable
.Range(0, (endDate-startDate).Days) // check the rounding
.Select(i => startDate.AddDays(i));
Parallel.ForEach(days, day => ....)
或者,你可以使用PLINQ在原始来源,可能更快。粗略地说:
// not tested
var sums = objs.AsParallel().GroupBy(x => x.date).Select(g => g.Sum(i => i.number));
答
Parallel.For
的所有重载取两个整数变量作为开始和结束。我也没有看到任何支持类似步骤的版本,因此您不能仅使用DateTime
的滴答计数作为循环变量。
但是,当您创建IEnumerable<DateTime>
作为源序列时,应该很容易使用Parallel.ForEach
。
var source = Enumerable.Range(0, (endDate - startDate).Days)
.Select(t => startDate.AddDays(t));
添加+1到count
参数如果endDate
是包容。
答
好几天后搜索我觉得如果我把所有的日子放在一个数组中,并通过它“whiled”。它给出了一个相当不错的结果。代码易读
var start = new DateTime(2014, 09, 09);
var end = new DateTime(2014, 10, 01);
var listOfDays = new List<DateTime>();
int i = 0;
for (var day = start; day < end; day = day.AddDays(1))
{
listOfDays.Add(day);
}
Parallel.ForEach(listOfDays.ToArray(), currentDay =>
{
for (var d = new DateTime(currentDay.Year, currentDay.Month, currentDay.Day, 0, 0, 0); d < new DateTime(currentDay.Year, currentDay.Month, currentDay.Day, 23, 59, 59); d = d.AddSeconds(5))
{
var str = "Loop: " + i + ", Date: " + d.ToString();
Console.WriteLine(str);
}
i++;
});
Console.Read();