永远迷失在if,while和foreach声明 - 无法获得适当的条件运行

时间:2015-12-23 14:22:18

标签: 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.Busysup.SupervisorOccupied在技术上是相同的,它们都在same class所以是的,sup可以继承emp.Busy

2 个答案:

答案 0 :(得分:5)

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

        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;
        }

如果最后"已分配== false",没有员工可用(实际上有一些代码丢失,因此它无法运行,但理论上它应该做你想要的!)。

答案 1 :(得分:3)

以下是您应该如何编写该代码:

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;