C# listbox控件 两个listbox间item的转移

第一段代码:
protected void Button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < selected.Items.Count; i++)
{
if (selected.Items[i].Selected)
{
select.Items.Add(selected.SelectedItem);
selected.Items.Remove(selected.SelectedItem);
}

        }
    }

第二段代码:
protected void Button6_Click(object sender, EventArgs e)
{
ArrayList temp = new ArrayList();
for (int i = 0; i < select.Items.Count; i++)
{
if (select.Items[i].Selected)
{
temp.Add(select.Items[i]);
}

        }
       foreach (ListItem item in temp)
           {
               selected.Items.Add(item);
               select.Items.Remove(item);
           }
    }

上面两个都能执行,第一段是将listbox1中的移进listbox2中,第二段是将转移到listbox2中一些项在挪回listbox1中,可以运行且结果正确,第一段得出的应该是错误的结果才对,但没错;
 如果”将转移到listbox2中一些项在挪回listbox1中“用的是第一段代码,会出现错误(item出现重复,转移不了等),为什么? 

该回答引用ChatGPT

在第一段代码中,循环体内的操作是将 selected.SelectedItem 移动到 select 中,但是移动时并没有考虑 i 的变化,导致在移动过程中可能会跳过某些项或者重复移动某些项。


在第二段代码中,首先将 select 中被选中的项保存在 temp 中,然后再遍历 temp 中的每一项,将其从 select 中移回 selected 中。这样能够避免第一段代码中的问题,因为循环体内的操作不会对列表的项数产生影响,所以循环中的索引变量不会出现问题。


如果将第一段代码用于“将转移到listbox2中一些项在挪回listbox1中”的操作中,那么在执行 selected.Items.Remove(selected.SelectedItem) 的时候,可能会导致某些项被跳过或者被重复移动。因此,最好使用第二段代码中的方法来实现将某些项从 select 移回 selected 中的操作。