2015-12-22 3 views
3

Метод:Невозможно выполнить правильное действие после того, как условие выполняется с использованием Перечислительные Flags

  • Список сотрудников
  • Каждый сотрудник имеет набор навыков, может содержать несколько навыков
  • 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

+0

почему вы используете оператор левого сдвига при определении вашего перечисления? Никогда не видел этого раньше. –

+0

@Steffen Я видел это раньше ... во-первых, он кажется немного менее подверженным ошибкам, чем умножение на 2 ('1 << 3' - 8,' 1 << 4' - 16 и т. Д.). , Не уверен, что это единственное преимущество. –

+0

@SteffenWinkler Мудрый комментатор в прошлом сформулировал перечисление вроде этого на этом сайте, я скопировал его, потому что он выглядел более эффективным, хотя он может содержать только 32 перечисления внутри, что выглядит менее подверженным ошибкам. Можете ли вы придумать лучший способ изложения перечислений? –

ответ

3

Там есть метод, называемый HasFlag на Enum класс, который будет делать то, что вам нужно:

.
var _skillRequired = MemberSkills.CSharp; 

if (emp.Skills.HasFlag(_skillRequired)) 
{ 
    ... 
} 

Если по каким-то причинам вы не можете изменить skillRequired, вам необходимо разобрать значение для перечисления:

var _skillRequiredAsEnum = (MemberSkills)Enum.Parse(typeof(MemberSkills), _skillRequired)); 
+0

К сожалению, это говорит мне, что 'невозможно преобразовать строку в System.Enum' –

+0

Является ли' _skillRequired' строкой? Сделайте это вместо «MemberSkills». –

+0

Я переформатировал свой код вместе с конструкторами и всем этим джазом, код работает так, как надо, вы получили мое спасибо –

2

Поскольку перечисление флагов, вы можете использовать метод .HasFlag из перечисления, чтобы проверить, является ли установлены флаги.

Или старому, вы можете использовать (emp.Skills & _skillRequired) == _skillRequired, чтобы увидеть, если все необходимые флаги установлены

 Смежные вопросы

  • Нет связанных вопросов^_^