- Список сотрудников
- Каждый сотрудник имеет набор навыков, может содержать несколько навыков
- Skill набор производных от перечисления
- Я хочу иметь цикл, который считывает перечисление, и если они содержат соответствующий навык, он выходит из цикла
Код
bool success = false;
foreach (Employee emp in employees)
{
while (emp.Busy != true || success == true)
{
if (emp.Busy == false && emp.Skills.ToString() == _skillRequired.ToString() && success == false)
{
emp.EmployeeWorkload = _jobName;
emp.ShiftsLeft = _shiftsLeft;
emp.Busy = true;
success = true;
}
else if (emp.Busy == true)
{
MessageBox.Show("Sorry there is no one available for this job");
}
Проблема
[Flags]
public enum MemberSkills { None = 0, CSharp = 1 << 0, SQL = 1 << 1, PHP = 1 << 2, Javascript = 1 << 3, Web = 1 << 4, Python = 1 << 5, Oracle = 1 << 6, CPlus = 1 << 7, Perl = 1 << 8 };
Employee e1 = new Employee(MemberJob.Employee, "Name", MemberSkills.CPlus | MemberSkills.CSharp, false);
Employee e2 = new Employee(MemberJob.Employee, "Another Name", MemberSkills.CSharp, false);
Поскольку объект содержит один или более MemberSkills
, если заявление читает объект как «CSharp | CPLUS»и не может правильно выполнить метод. Вместо того, чтобы выбрать сотрудника с CSharp в их набор навыков. См e2
почему вы используете оператор левого сдвига при определении вашего перечисления? Никогда не видел этого раньше. –
@Steffen Я видел это раньше ... во-первых, он кажется немного менее подверженным ошибкам, чем умножение на 2 ('1 << 3' - 8,' 1 << 4' - 16 и т. Д.). , Не уверен, что это единственное преимущество. –
@SteffenWinkler Мудрый комментатор в прошлом сформулировал перечисление вроде этого на этом сайте, я скопировал его, потому что он выглядел более эффективным, хотя он может содержать только 32 перечисления внутри, что выглядит менее подверженным ошибкам. Можете ли вы придумать лучший способ изложения перечислений? –