0

1週間のトレーニング(31回のトレーニング)のみを含むスケジュールがあり、スケジュールが終了するまで残りのトレーニングを生成する必要があります(例:20120601-20120831)。だから私は多分ワークアウトをループしてすべてのworkout.dateにaddDays(7)を置くことを考えました。

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

1 に答える 1

0

DateTime不変です。つまり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の場合、ワークアウトが行われる特定の時点を維持するのではなく、メンバーの形で週の初めからオフセットすることです。この表現を使用すると、ご覧のとおり、1週間の計画をスケジュール全体に拡張する方がはるかに簡単です。TimeSpanWeekOffset

空白を埋めて、私の提案をコードベースに合わせるのはあなた次第です。この新しいクラスを作成したいと思うかもしれませんし、プロジェクトの全体像に応じて、WorkoutInfo既存のクラスと何らかの形でマージしたほうがよいかもしれません。Workout

これ以上問題が発生した場合は、お知らせください。

于 2012-08-05T21:47:50.803 に答える