2012-08-05 57 views
0

我有一个只包含一周训练(31次训练)的时间表,现在我需要生成其余的训练,直到时间表结束(例如20120601-20120831)。 所以我想可能循环锻炼,并把addDays(7)放在所有workout.date上。如何在计划中生成缺失的日期?

我已经尝试使用foreach和for,但不能得到它的工作。

我GenerateSchedule方法:

public ActionResult GenerateSchedule(int scheduleId) 
    { 
     //get schedule included list of 31 workouts 
     //only added one week on workouts 
     var schedule = _scheduleServices.GetSchedule(scheduleId); 
     var workouts = schedule.Workouts.ToList(); 
     int i = 0; 
     for(var day = schedule.FromDate; day.Date <= schedule.ToDate; day = day.AddDays(1)) 
     { 
      foreach (var workout in workouts) 
      { 

      } 

      var newWorkout = new WorkoutFormModel 
      { 
       ScheduleId = workouts[i].ScheduleId, 
       Date = workouts[i].Date.AddDays(7), 
       StartTime = workouts[i].StartTime, 
       EndTime = workouts[i].EndTime, 
       InstructorId = workouts[i].Instructor.Id, 
       CourseId = workouts[i].Course.Id, 
      }; 

      i++; 
      _workoutServices.AddWorkout(newWorkout); 
     } 

     /* 
     foreach(var workout in schedule.Workouts) 
     { 
      if (workout.Date.AddDays(7) <= schedule.ToDate) 
      { 
       var newWorkout = new WorkoutFormModel 
            { 
             ScheduleId = workout.ScheduleId, 
             Date = workout.Date.AddDays(7), 
             StartTime = workout.StartTime, 
             EndTime = workout.EndTime, 
             InstructorId = workout.Instructor.Id, 
             CourseId = workout.Course.Id, 

            }; 
       _workoutServices.AddWorkout(newWorkout); 
      } 
     }*/ 

     return RedirectToAction("Overview", new { scheduleId }); 
    } 

更新:

private static List<WorkoutFormModel> ExtendSchedule(Schedule schedule) 
    { 
     var workoutList = new List<WorkoutFormModel>(); 

     for (var workoutStart = schedule.FromDate; workoutStart <= schedule.ToDate; workoutStart = workoutStart.AddDays(7)) 
     { 


      workoutList.AddRange(schedule.Workouts.Select(Workout => new WorkoutFormModel 
      { 
       ScheduleId = schedule.Id, 
       Date = workoutStart.Add(Workout.WeekOffset), 
       StartTime = Workout.StartTime, 
       EndTime = Workout.EndTime, 

       Course = Workout.Course 
      })); 
     } 

     return workoutList; 
    } 
+0

你只是将你的锻炼保持在列表中? (基本上是线性数组?)你可以将它们存储在HashMap中吗?然后,您可以使用DateTime的自定义子类作为关键字,并从工作日开始查找锻炼,并开始计时 – olagjo 2012-08-05 22:20:17

回答

0

DateTimeimmutable。也就是说,AddDays()返回DateTime的新实例,使您将其调用的实例保持不变。所以,你的循环可能是这样的:

for(var day = schedule.FromDate; day.Date <= schedule.ToDate; day = day.AddDays(1)) 

编辑:现在,我们一致认为它更像是一个设计问题,我的建议是:

  • 写了下面的帮助功能,请尽可能详细说明其输入:

    private List<WorkoutFormModel> ExtendSchedule(Schedule schedule, IEnumerable<WorkoutInfo> oneWeekWorkouts) 
    { 
        var workoutList = new List<WorkoutFormModel>(); 
        foreach (var workoutStart = schedule.FromDate; workoutStart <= schedule.ToDate; workoutStart = workoutStart.AddDays(7)) 
        { 
         workoutList.AddRange(oneWeekWorkouts.Select(workout => new WorkoutFormModel 
              { 
               ScheduleId = schedule.Id, 
               Date = workoutStart.Add(workout.WeekOffset), 
               StartTime = ?, 
               EndTime = ?, 
               InstructorId = workout.Instructor.Id, 
               CourseId = workout.Course.Id 
              })); 
        } 
    
        return workoutList; 
    } 
    

    其中WorkoutInfo是表示锻炼的类。我对它的命名方式不同,因此它不会与您使用的类型相冲突,但基本上与您的Schedule.Workouts列表中的项目相同。主要区别在于,在我的WorkoutInfo中,您不保留锻炼将要进行的特定时间点,而是从本周开始的偏移量,形式为TimeSpan成员WeekOffset。如您所见,使用这种表示法,将一周的计划延长到整个计划表会更直接。

您可以填写空白并将我的建议与您的代码库对齐。也许你会想创建这个新的WorkoutInfo类,也许它会更好地与你现有的Workout类合并,这取决于你的项目的全貌。

如果您遇到更多困难,请告诉我。

+0

问题是每天有超过一次的锻炼。 – n3tx 2012-08-05 21:53:14

+0

因此,如果我做得对,在您的日程安排中您定义了一周的锻炼,并且您希望将此模式延伸到整个计划。如果这是正确的,我认为你不是很好地模拟这种情况。该功能并没有给出它应该达到什么的清晰印象。 – twoflower 2012-08-05 22:04:14

+0

是的,这是正确的。我很抱歉造型,但不知道我在做什么。 – n3tx 2012-08-05 22:06:59