var staff = new[] { "A", "B", "C", "D", "E" }; //哪些人 var duty = new[] { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Friday, DayOfWeek.Sunday }; //星期几需要有人值班 var group = 2; //每次几个人值班 var count = 0; for (var date = new DateTime(2012, 4, 20); //开始时间 date <= new DateTime(2012, 5, 23); //结束时间 date += TimeSpan.FromDays(1)) { if (duty.Contains(date.DayOfWeek)) { count += group; } } var index = count % staff.Length;
那么最后值班的就是staff数组里index, index+1, ... index+(group-1) 这几个人。把代码里几个地方提取成参数就可以了。
如果没特殊情况,AB\CD\EA\BC\DE的方式循环就好。
上面的人数 值班数 等等都是变量 想写个通用的方法 传入值 得到结果/大哥可以详细点吗?
@MissJacker: 一样的采取这个循环就好。对每个人定义一个最后一次值班的日期信息,每次安排值班人员的时候,一定优先安排休息时间最长的人就好。