2015-12-19 3 views
0

У меня есть общий список сотрудников, я хочу удалить их из списка после достижения определенного условия.Как удалить объект из списка после достижения условия

В настоящее время мне удалось получить близкую форму работы, но если в списке есть более одного объекта, он дублируется после запуска методов.

  • Каждый сотрудник имеет shifts left переменную, если это заканчивается они транспортируются обратно в free список

private void btnCycle_Click(object sender, EventArgs e) 
{ 
    foreach (Employee emp in employees) 
    { 
     if (emp.Busy == true) 
     { 
      emp.ShiftsLeft--; 
      if (emp.ShiftsLeft == 0) 
      { 
       lstOccupied.Items.Clear(); 
       emp.Busy = false; 
       DisplayData(employees); 
      } 
     } 
    } 
} 

private void DisplayData(List<Employee> employees) 
{ 
    foreach (Employee emp in employees) 
    { 
     if (emp.Busy == false) 
      lstFree.Items.Add(emp); 
     else if (emp.Busy == true) 
      lstOccupied.Items.Add(emp); 
    } 
} 

Это объекты в использовать в ми Нут

Employee e1 = new Employee(MemberJob.Employee, "Name", MemberSkills.CPlus, true, 
    "Do this Job", 5); 

Employee e2 = new Employee(MemberJob.Employee, "Another name", MemberSkills.CSharp, true, 
    "Do another Job", 2); 

Результат

Что в настоящее время происходит с кодом, который я предусмотрел, что после Another name завершения их сдвига (2 смены), они транспортируются обратно в free ListBox, и они исчезают из списка occupied, который я хотел, после того, как Name закончен, они снова помещаются в free, но another name отображается дважды.

Возможное решение

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

+1

Правильный способ сказать 'if (emp.Busy == false) lstFree.Items.Add (emp); else if (emp.Busy == true) lstOccupied.Items.Add (emp); 'is' if (emp.Busy) lstOccupied.Items.Add (emp); else lstFree.Items.Add (emp); ' –

+0

@ OlivierJacot-Descombes Да, я даже не заметил, что, пока вы не указали на это, я бы попробовал бы мой код в конце программы, но спасибо, что указал на это и сохраняя его единообразным стандартом :) –

ответ

4

Завершите логическую работу первого цикла, не пытаясь обновить списки, пока вы все еще выполняете цикл. В конце цикла DisplayData после очистки обоих списков.

private void btnCycle_Click(object sender, EventArgs e) 
{ 
    foreach (Employee emp in employees) 
    { 
     if (emp.Busy) 
     { 
      emp.ShiftsLeft--; 
      emp.Busy = emp.ShiftsLeft > 0; 
      // Do not try to update here 
      // finish the logic loop and... 
     } 
    } 
} 

// Clear the content of both lists 
lstFree.Items.Clear(); 
lstOccupied.Items.Clear(); 

// Now rebuild both lists 
DisplayData(employees); 

Если вы хотите удалить двойную петлю на список сотрудников можно очистить два ListBoxes перед началом первого цикла и readd записи, как только вы могли бы определить состояние занятости каждого сотрудника

private void btnCycle_Click(object sender, EventArgs e) 
{ 
    // Clear the content of both lists 
    lstFree.Items.Clear(); 
    lstOccupied.Items.Clear(); 

    foreach (Employee emp in employees) 
    { 
     if (emp.Busy) 
     { 
      emp.ShiftsLeft--; 
      if (emp.ShiftsLeft == 0) 
      { 
       lstFree.Items.Add(emp); 
       emp.Busy = false; 
      } 
      else 
       lstOccupied.Items.Add(emp); 
     } 
    } 
} 

Из корса вы больше не вызываете DisplayData в этом контексте.

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

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