2015-12-22 163 views
3

方法:無法執行正確的操作

  • 員工的名單
  • 每個員工都有一個技能,可以包含若干個技能
  • 技能集是從枚舉派生
  • 我想能夠有一個循環讀取枚舉,如果它們包含適當的技能它出來的循環

代碼

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,if語句讀取對象「CSHARP | CPlus」,不能正確地執行該方法。在他們的技能而不是選擇與CSHARP僱員。見e2

+0

爲什麼定義你的枚舉,當你使用左移操作?以前從未見過。 –

+0

@Steffen我以前見過......一件事,它似乎比乘以2稍微少一點錯誤(「1 << 3」是8,「1 << 4」是16等) 。不知道這是唯一的好處。 –

+0

@SteffenWinkler過去一位明智的評論者在這個網站上這樣列舉了一個枚舉,我複製它,因爲它看起來更有效,儘管它內部只有32個枚舉看起來不太容易出錯。你能想出一個更好的枚舉枚舉方法嗎? –

回答

3

有一個在Enum類稱爲HasFlag方法,將你需要的東西:

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,看看是否所有必需的標誌設置