2014-09-24 101 views
0

确定此代码是有点元,但它大致说明了我现在如何以及我想实现什么。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); 
} 

但是,我如何使它步骤日期?

回答

3

你可以让一个范围,并遍历它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)); 
1

Parallel.For的所有重载取两个整数变量作为开始和结束。我也没有看到任何支持类似步骤的版本,因此您不能仅使用DateTime的滴答计数作为循环变量。

但是,当您创建IEnumerable<DateTime>作为源序列时,应该很容易使用Parallel.ForEach

var source = Enumerable.Range(0, (endDate - startDate).Days) 
         .Select(t => startDate.AddDays(t)); 

添加+1到count参数如果endDate是包容。

0

好几天后搜索我觉得如果我把所有的日子放在一个数组中,并通过它“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();