c# - 在 C# 中使用 foreach 循环时修改集合

标签 c# python invalidoperationexception

<分区>

基本上,我想在 foreach 循环内从列表中删除一个项目。我知道这在使用 for 循环时是可能的,但出于其他目的,我想知道这是否可以使用 foreach 循环实现。

在 python 中,我们可以通过执行以下操作来实现这一点:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in a:
    print i

    if i == 1:
        a.pop(1)

这给出了以下输出

>>>1
3
4
5
6
7
8
9

但是当在 C# 中做类似的事情时,我得到了一个 InvalidOperationException,我想知道是否有办法解决这个问题,不只是简单地使用 for 循环

我在抛出异常时使用的c#代码:

static void Main(string[] args)
  {
  List<string> MyList = new List<string>(new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9"});

  foreach (string Item in MyList)
    {
    if (MyList.IndexOf(Item) == 0)
      {
      MyList.RemoveAt(1);
      }

    Console.WriteLine(Item);
    }
  }

提前致谢

最佳答案

你不能这样做。来自 IEnumerator<T> 的文档:

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.

备选方案是:

  • 建立一个新的要删除的项目列表,然后将它们全部删除
  • 使用普通的“for”循环并确保小心不要遍历同一元素两次或遗漏任何元素。 (你说过你不想这样做,但你试图做的是行不通的。)
  • 建立一个新的集合,只包含你想保留的元素

这些替代方案中的最后一个是类似 LINQ 的解决方案,您通常会在其中编写:

var newList = oldList.Where(x => ShouldBeRetained(x)).ToList();

(当然,ShouldBeRetained 是您想要的任何逻辑。)对 ToList() 的调用仅当您确实希望它出现在列表中时才需要。这导致更多的声明性代码通常更易于阅读。我不能轻易猜出你原来的循环是用来做什么的(目前看起来很奇怪),而如果你可以纯粹根据项目来表达逻辑,它会更清晰。

关于c# - 在 C# 中使用 foreach 循环时修改集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124221/

相关文章:

c# - 如何从包含反斜杠的字符串中解析 guid?

python - 如何知道哪个进程负责 "OperationalError: database is locked"?

buffer - glNamedBufferData 触发 GL_INVALID_OPERATION

C# 找出导致 Sql 异常的列

python - 不同数据帧列中列出的不同缺失值将替换为 NaN

c# - DataGridView 控件必须绑定(bind)到要排序的 IBindingList 对象

c# - 在 ASP.NET MVC 中模拟用户进行测试

c# - 使用 C# 检索完整的进程列表

c# - 如何从自定义属性中确定附加类型?

python - Keras:如何存储每个纪元后的历史记录?