如何在C#周末分配唯一的员工

时间:2017-03-09 12:43:12

标签: c# datetime

我有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

等等......直到所有人都被分配后才会被分配。之后,列表将重新开始。任何人都可以帮我吗?

3 个答案:

答案 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);
}