Dan*_*son 3 c# foreach if-statement boolean while-loop
我已经花了几个小时来解决这个问题,它很基本,但很快就失控了.
因为它相当令人困惑,我会发布我想要它做的事情和实际做的事情
目标
如果主管忙,它会转到下一个,如果他们都忙,它会显示一条消息"对不起所有主管都忙".与所有员工一样.
方法
我希望这个方法能够读取所有主管,如果一个人不忙,就继续下去,然后我希望它能够读取所有员工,如果一个人不忙,就继续下去.
然后它会读取员工是否具备相应的技能,以及是否已经满足成功,以避免为同一个人分配相同的工作.
如果到目前为止这一切都很好,它会检查主管是否被占用,如果是,它会恢复并更改主管.
然后,它会为员工分配信息,同时为主管分配一些信息并检查"成功"条件.
从这里开始有点草率,你可以看到,我已经放了许多布尔语句来简单地从循环中取出程序并退出它.
在所有这一切之后,程序分配工作,到目前为止,它工作到合理的程度,但我希望有一条消息说明如果所有的主管都忙,那么就不能分配更多的工作.
我在过去,MessageBox.Show在foreach语句之后使用,但如果一个主管忙,它将显示不是我想要的消息.
码
分配作业的方法
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果有人能够想到一种更简单的方法,我会对想法持开放态度.
编辑1
这不是一个多线程系统,是的emp.Busy,sup.SupervisorOccupied在技术上是相同的东西,它们都是在same class所以是可以继承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;
}
Run Code Online (Sandbox Code Playgroud)
如果在最后"assign == false",没有员工可用(实际上有一些代码丢失,所以它无法运行,但理论上它应该做你想要的!).