C# 永远迷失在if、while和foreach语句中-无法获得适当的运行条件
我在这个问题上花了相当多的时间,这是一个非常基本的问题,但很快就失去了控制 因为它相当混乱,我将发布我想要它做什么和它实际做什么 目标 如果一个主管正忙,它将转到下一个主管,如果他们都忙,它将显示一条消息“对不起,所有主管都忙”。所有员工也是如此 方法 我希望该方法读取所有主管,如果一个人不忙,则继续向下,然后我希望它读取所有员工,如果一个人不忙,则继续向下 然后,它会阅读员工是否具备适当的技能,是否已经取得了成功,以避免同一个人被分配到相同的工作 如果到目前为止一切正常,它将检查主管是否已被占用,如果已被占用,它将返回并更改主管 然后,它向员工分配信息,也向主管分配一些信息,并检查“成功”条件 从这里开始,它开始变得有点草率,正如您所看到的,我使用了许多布尔语句来简单地将程序从循环中取出并退出它 在所有这些之后,程序分配工作,到目前为止,它工作到了合理的程度,但我希望有一个消息,说明如果所有的主管都很忙,就不能分配更多的工作 我过去曾在foreach语句后使用过C# 永远迷失在if、while和foreach语句中-无法获得适当的运行条件,c#,if-statement,foreach,while-loop,boolean,C#,If Statement,Foreach,While Loop,Boolean,我在这个问题上花了相当多的时间,这是一个非常基本的问题,但很快就失去了控制 因为它相当混乱,我将发布我想要它做什么和它实际做什么 目标 如果一个主管正忙,它将转到下一个主管,如果他们都忙,它将显示一条消息“对不起,所有主管都忙”。所有员工也是如此 方法 我希望该方法读取所有主管,如果一个人不忙,则继续向下,然后我希望它读取所有员工,如果一个人不忙,则继续向下 然后,它会阅读员工是否具备适当的技能,是否已经取得了成功,以避免同一个人被分配到相同的工作 如果到目前为止一切正常,它将检查主管是否已被占
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语句轻松解决