我在这个问题上花了好几个小时,这是非常基本的,但很快就失控了。

因为它相当困惑,我会发布我想要它做什么以及它实际做什么

目标

如果一个主管很忙,它会转移到下一个,如果他们都忙,它会显示一条消息“对不起,所有主管都很忙”。对所有员工也是如此。

方法

我想要读取所有主管的方法,如果一个人不忙,则继续向下,然后我希望它读取所有员工,如果一个人不忙,则继续向下。

然后它会读取员工是否具有适当的技能以及是否已经取得成功,以避免同一个人被分配相同的工作。

如果到目前为止一切顺利,它会检查主管是否被占用,如果是,则返回并更改主管。

然后它为员工分配信息,也为主管分配一些信息并检查“成功”条件。

从这里开始变得有点草率,正如您所看到的,我已经放置了许多 boolean 语句来简单地使程序退出循环并退出它。

毕竟,程序分配了工作,到目前为止,它在合理的程度上工作,但我希望有一条消息,说明如果所有主管都忙,则无法分配更多工作。

我过去曾在 foreach 语句之后使用 MessageBox.Show 但如果一位主管很忙,它将显示不是我想要的消息。

代码

分配作业的方法

bool finishLast = false;
bool successFirst = false;
while (successFirst != true)
{
    foreach (Supervisor sup in supervisors)
    {
        bool failure = false;
        while (failure != true)
        {
            foreach (Employee emp in employees)
            {
                if (emp.Busy == false && emp.Skills.HasFlag(_skillRequired) && successFirst == false)
                {
                    if (sup.SupervisorOccupied == false)
                    {
                        successFirst = true;
                        emp.EmployeeWorkload = _jobName;
                        emp.ShiftsLeft = _shiftsLeft;
                        emp.Busy = true;
                        sup.EmployeeWorkload = "Supervising Employee: " + emp.EmployeeName + " to finish task: " + emp.EmployeeWorkload;
                        sup.ShiftsLeft = _shiftsLeft;
                        sup.SupervisorOccupied = true;
                    }
                }
                else if (emp.Busy == true)
                {
                    failure = true;
                }
            }
        }
        if (failure == true)
        {
            finishLast = true;
        }
    }
    if (finishLast == true)
    {
        successFirst = true;
    }
}

当然,如果有人能想到一个更简单的方法,我会乐于接受想法。

编辑 1

这不是一个多线程系统,是的 emp.Busysup.SupervisorOccupied 在技术上是一回事,它们都在 same class 中,所以 yes sup 可以继承 emp.Busy

最佳答案

我认为这样的事情应该有效:

        bool assigned = false;
        foreach (Supervisor sup in supervisors)
        {
            if (!sup.SupervisorOccupied)
            {
                foreach (Employee emp in employees)
                {
                    if (!emp.Busy && emp.Skills.HasFlag(_skillRequired))
                    {
                        assigned = true;
                        emp.EmployeeWorkload = _jobName;
                        emp.ShiftsLeft = _shiftsLeft;
                        emp.Busy = true;
                        sup.EmployeeWorkload = "Supervising Employee: " + emp.EmployeeName + " to finish task: " + emp.EmployeeWorkload;
                        sup.ShiftsLeft = _shiftsLeft;
                        sup.SupervisorOccupied = true;
                        break;
                    }
                }
            }
            if (assigned)
                break;
        }

如果最后“assigned == false”,则没有可用的员工(实际上缺少一些代码,因此无法运行,但理论上它应该可以执行您想要的操作!)。

关于c# - 永远迷失在 if、while 和 foreach 语句中 - 无法获得适当的条件来运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34437704/

10-16 11:16