【问题标题】:InvalidOperationException after removing an element in an arrayList [duplicate]删除 arrayList 中的元素后出现 InvalidOperationException [重复]
【发布时间】:2012-10-10 20:49:43
【问题描述】:

您好,我正在尝试从 arrayList 中删除所有可被 2 整除的数字。问题是在删除一个元素后,我得到了 InvalidOperationException。

   private ArrayList RemoveDivTwo(ArrayList list) {
        int count = 0;
        foreach(int i in list){
            if ((i > 2) && (i % 2 == 0)) {
                list.RemoveAt(count); 
            }
            count++;
        }

        return list;
    }

我怎样才能解决这个问题,这样我就不会得到异常并且能够删除所有可被二整除的元素?

【问题讨论】:

  • 这是一个常见的。请记住,如果您使用 foreach 进行迭代,则无法在集合中添加/删除项目。
  • 如果你在想,为什么这是一个无效的操作,请阅读这个stackoverflow.com/questions/1124221/…
  • ArrayList 不是首选的集合类型,除非您使用的是旧版 1.1 代码。请改用List<int>。使用List<int>,您的代码可以重写为list.RemoveAll(i => i > 2 && i % 2 == 0)

标签: c#


【解决方案1】:

尝试以这种方式对其进行迭代。

for(int i = 0; i < list.Count(); i++){
   if ((list[i] > 2) && (list[i] % 2 == 0)) {
                list.RemoveAt(i); 
                i--; //as offsets have shifted by one due to removal
            }
}

您不再遍历列表。所以这应该可行。

【讨论】:

  • 唯一的问题是我使用的是arrayList,我无法获取元素抛出的索引
  • 是的,你可以;您只需要将它们转换回 int 即可。如果可以的话,这是使用List&lt;int&gt; 的另一个原因。
【解决方案2】:

抛出异常的原因是,foreach 循环在开始遍历项目列表之前调用了 collectionName.GetEnumerator 方法。除非您在集合上启动新的 foreach 循环,否则不会再次调用 GetEnumerator。列表不能在 foreach 循环内修改,它仅用于列表上的只读操作。

您可以使用 for 循环进行迭代以及修改列表中的元素。

【讨论】:

    【解决方案3】:

    我什至不会费心删除元素。只需将您想要的元素作为新列表返回:

    List<int> RemoveDivTwo(List<int> list) {
        return list.Where(i => i % 2 == 1 || i <= 2).ToList();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多