如何在达到条件后从列表框中删除对象

How to remove an object from a listbox after a condition is reached

我有一个通用的员工列表,我想在达到特定条件后将他们从列表框中删除。

目前我已经设法得到它的一种接近形式,但是如果列表框中有多个对象,它会在方法 运行 之后被复制。


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 列表框,它们从 occupied 列表框中消失,这正是我想要的,然后在 Name 完成后,它们会放回 freeanother name 显示两次。

可能的解决方案

我可以这样,如果这个名字在 free 上显示了不止一次,它就会被删除,只显示一次,但这很混乱,我可以想象如果一个员工的名字与另一个这会引起冲突。

完成第一个循环的逻辑工作,而不是在您仍在 运行 循环时尝试更新列表。清除两个列表后在循环 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);

如果您想删除员工列表上的双循环,您可以在开始第一个循环之前清除两个列表框,并在确定每个员工的忙碌状态后立即重新添加条目

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。