我有7名员工的名单。我正在迭代当前月份的日期循环,并希望在每个日期分配两名员工,但在周末,他们不应重复,直到所有员工都被分配。例如:我有七名员工:
John
Sophia
Olivia
Davis
Clark
Paul
Thomas
现在我的日期循环是:
for (int i = 0; i < dates.Length; i++)
{
DateTime newDate = new DateTime();
newDate = dates[i];
/*if(newdate == "Saturday")
var EmpName1 = emplist[i];
var EmpName2 = emplist[i];*/
}
在上面的循环中,我希望在周六和周日分配两名员工,直到之前没有分配任何其他员工。像这样:
4th March: John and Sophia
5th March: Olivia and Davis
11th March: Clark and Paul
12th March: Thomas and John
等等......直到所有人都被分配后才会被分配。之后,列表将重新开始。任何人都可以帮我吗?
答案 0 :(得分:1)
每次需要选择一个时,请为该人选择单独的索引。 选择后,使用以下命令更改索引:
index = (index + 1) % employees.Length // Number fo employees
%(表示模数)确保在达到employees.Length时计数器再次从0开始。
类似于:
var empIndex = 0;
for (int i = 0; i < dates.Length; i++)
{
DateTime newDate = new DateTime();
newDate = dates[i];
if(newdate == "Saturday") // and Sunday, use or: || (newData == "Sunday"))
{
var EmpName1 = emplist[empIndex];
empIndex = (empIndex + 1) % empList.Length;
var EmpName2 = emplist[empIndex];
empIndex = (empIndex + 1) % empList.Length;
}
}
答案 1 :(得分:1)
对我来说,这归结为通过DateOfLastWeekendOnCall订购员工?
var e = Employees.OrderBy(i=>i.DateOfLastWeekendOnCall).First();
e.DateOfLastWeekendOnCall = weekendThatNeedsAssigning;
阐释:
“在指定所有其他员工之前,不要指派员工”
相当于
“指定分配的最长日期为最低所有员工(或从未分配过的员工)的员工”
因此,如果您跟踪每个员工被分配到的最后一个星期六,那么您可以轻松查看下一个日期应分配给哪个员工。
你可以输入一些特殊的逻辑来处理null case,或者只是将MinDate作为默认值放入
答案 2 :(得分:0)
您可以使用队列:
var weekendWarriors = new Queue<string>();
CheckRefreshQueue<string>(weekendWarriors, employees);
for (int i = 0; i < dates.Length; i++)
{
DateTime newDate = new DateTime();
newDate = dates[i];
if (newDate.DayOfWeek == DayOfWeek.Saturday || newDate.DayOfWeek == DayOfWeek.Sunday)
{
string emp1;
string emp2;
CheckRefreshQueue<string>(weekendWarriors, employees);
emp1 = weekendWarriors.Dequeue();
CheckRefreshQueue<string>(weekendWarriors, employees);
emp2 = weekendWarriors.Dequeue();
}
}
此处CheckRefreshQueue
:
private static void CheckRefreshQueue<T>(Queue<T> toRefresh, IEnumerable<T> fromCollection)
{
if (toRefresh.Count == 0) foreach (T item in fromCollection) toRefresh.Enqueue(item);
}