C# 永远迷失在if、while和foreach语句中-无法获得适当的运行条件

C# 永远迷失在if、while和foreach语句中-无法获得适当的运行条件,c#,if-statement,foreach,while-loop,boolean,C#,If Statement,Foreach,While Loop,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.Busy
sup.supervisorOccuped
在技术上是相同的,它们都在
相同的类中
,因此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”结尾,则没有员工可用(实际上缺少一些代码,因此无法运行,但理论上它应该做您想做的事情!)。

以下是编写代码的方法:

var availableSupervisor = supervisors
    .FirstOrDefault(supervisor => !supervisor.SupervisorOccupied);
if (availableSupervisor == null)
    return;

var availableEmployee = employees
    .FirstOrDefault(employee => !employee.Busy && employee.Skills.HasFlag(_skillRequired));
if (availableEmployee == null)
    return;

availableEmployee.EmployeeWorkload = _jobName;
availableEmployee.ShiftsLeft = _shiftsLeft;
availableEmployee.Busy = true;
availableSupervisor.EmployeeWorkload = "Supervising Employee: " + emp.EmployeeName + " to finish task: " + emp.EmployeeWorkload;
availableSupervisor.ShiftsLeft = _shiftsLeft;
availableSupervisor.SupervisorOccupied = true;

你能更新你的问题并添加一个真正的“目标”吗?你首先描述你正在做什么,而不是结果应该是什么。我猜你是在为用户分配工作,但我不完全清楚这应该如何发生,以及你的出发点是什么。重新阅读你的代码后,听起来你想做以下事情:找到一个可用的主管。找到一名具备该工作技能的员工。将工作分配给员工,并指派主管监督该员工的工作。如果这是正确的,你就不应该有嵌套的循环。我建议你删除所有while循环和不需要的boolean,因为它们非常令人困惑。我也很难理解这段短代码的含义,这本身就是一个问题,因为它显然缺乏正确性。有几件事会有帮助。首先,如果(x!=true)
等,停止执行
。等式生成布尔值,但布尔值已经是布尔值了!如果你的意思是
If(x==true)
while(x==true)
只要说
If(x)
while(x)
。如果x=false,则使用
if(x==false)
——如果x为false,则使用
if(!x)
——如果x的对立面为true。第二,将此问题分解为更小的方法,每个方法都在问题的情况下执行某些操作。正如Lasse所说,如果问题的一部分是找到一个可用的主管,那么应该有一个方法
FindAvailableSupervisor
,该方法返回主管,如果没有这样的主管,则返回null。编写这个方法,测试它,现在你有了一个子系统,你可以依靠它来解决一个更大的问题。试着从商业领域的角度来写问题陈述,而不是你打算如何写代码。太好了,这似乎奏效了,我知道我把它复杂化了,但在凌晨4点,一个人不能急于重新制定想法,我会在短时间内给你答案。很好,丹尼很乐意帮忙。请看一下其他答案,因为您必须有机会选择实现,请“接受”答案,谢谢。实际上,我不太喜欢使用异常来控制程序流。即使他说这不是一个多线程环境,我认为很容易发生这样的情况:执行循环的一段代码(可能在其中花费一段时间)后来被移入计时器:在这种情况下,管理异常肯定比更新外部“状态”更复杂对象,也就是关于操作进度的信息(以及最终结果-显然是“指定的”布尔值)。虽然从长远来看,您的答案看起来是最有效的,但我选择了一个适合我工作环境的答案,虽然我感谢你的评论和回答,但请不要认为我忽视了你的努力。谢谢。@Lasse:如果您将
.Where(supervisor=>!supervisor.supervisorOccuped).FirstOrDefault()替换为
.FirstOrDefault(supervisor=>!supervisor.SupervisorOccuped)
,此代码会更干净一些。显然,你也可以对可用员工做同样的事情。
@LeonardoSpina:我同意你的观点,我不喜欢使用例外,但我确实认为拉塞的方法远远优于OP现有的方法。异常可以用循环代替。丹尼,我强烈建议你采用拉西的方法;使用嵌套循环更难理解。嵌套循环方法的效率也较低,但可以通过额外的break语句轻松解决