IDictionaryEnumerator myEnumerator=_sortedlist.GetEnumerator();
while(myEnumerator.MoveNext())
{
Emp objA=(Emp)_sortedlist[myEnumerator.Key];
if((string)(this.lstEmp.SelectedItem)==objA.Name)
{
for(int count=0;count<this.lstEmp.SelectedItems.Count;count++)
{
this.lstEmp.Items.Remove(this.lstEmp.SelectedItems[count]);
}
_sortedlist.Remove(this.txtEmployeeName.Text);                         }
}
如以上代码,使用hashtable,想实现删除列表框中的Item的同时删除hashtable中的值,但是我这样写会报异常:System.InvalidOperationException: 集合已修改;枚举操作可能不会执行。
不知道怎么解决?

解决方案 »

  1.   

    只用FOR循环?不解能具体一点吗?
      

  2.   

    不要在while循环里删除HashTable中的值,你可以将筛选出来的值放到一个数组或ArrayList中然后退出while循环后在进行删除操作
      

  3.   

    IDictionaryEnumerator myEnumerator=_sortedlist.GetEnumerator();
    while(myEnumerator.MoveNext())
    {
    Emp objA=(Emp)_sortedlist[myEnumerator.Key];
    if((string)(this.lstEmp.SelectedItem)==objA.Name)
    {
    for(int count=0;count<this.lstEmp.SelectedItems.Count;count++)
    {
    this.lstEmp.Items.Remove(this.lstEmp.SelectedItems[count]);
    }
    }
    ArrayList objArr=new ArrayList(_sortedlist.Keys);
    }
    _sortedlist.Remove(this.txtEmployeeName.Text);
    这样做以后,不如说有两个Items,我删除下面那个以后,上一个Item就不能删除了。???怎么回事???
      

  4.   

    在foreach循环里,不能改变当前遍历对象里的元素,可采用一个集合对象过渡一下。
    如:ArrayList arr = new ArrayList(); //作为过渡
    HashTable hs = new HashTable();  //欲改变的HashTable
    //hs.Add(..);//给hs添加元素
    foreach(string k in hs.Keys)
    {
      arr.Add(k);
    }
    foreach(string k in arr)
    {
      Emp objA=(Emp)_sortedlist[k]; 
      if((string)(this.lstEmp.SelectedItem)==objA.Name) 
      {
        hs.Remove(k);
      }
    }
    //若是自定义的,做法同
      

  5.   

    枚举(foreach,Enumerator.MoveNext())的同时不可以修改列表元素
      

  6.   

    每一个有个实现IEnumerator接口的.net类库的集合中,都会对本集合有个版本控制,但删除或添加时,这个版本就会改变,当调用MoveNext是会抛出InvalidOperationException异常
    解决方法就是按ojlovecd所说的方法,至于你上面的问题没法回答,看不懂代码
      

  7.   

    通过foreach或者Enumerator的方式遍历一个集合只能做一部分基本操作,不能对集合作出修改,例如加入和删除。唯一支持修改的遍历方式是使用for循环。for(int i = 0; i < _sortedlist.Count; i++)
    {
      Emp objA = (Emp)_sortedlist[i];
    if((string)(this.lstEmp.SelectedItem)==objA.Name)
    {
    for(int count=0;count <this.lstEmp.SelectedItems.Count;count++)
    {
    this.lstEmp.Items.Remove(this.lstEmp.SelectedItems[count]);
    }
    _sortedlist.Remove(this.txtEmployeeName.Text);                         }
      

  8.   


    按这样来修改,提示异常:“System.InvalidOperationException: 指定的 IComparer 引发异常。 ---> System.ArgumentException: 对象的类型必须是 String。”
    这个是怎么回事?
      

  9.   

    你在用最外层的while循环遍历hashtable的时候,在内层却把这个hashtable的项删掉了,这样操作是不允许的。