【问题标题】:Modifying Collection when using a foreach loop in c# [duplicate]在c#中使用foreach循环时修改集合[重复]
【发布时间】:2010-11-10 14:05:35
【问题描述】:

基本上,我想在 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);
    }
  }

提前致谢

【问题讨论】:

    标签: c# python invalidoperationexception


    【解决方案1】:

    你不能这样做。来自IEnumerator&lt;T&gt; 的文档:

    枚举数保持有效,只要 集合保持不变。如果 对集合进行了更改, 例如添加、修改或删除 元素,枚举数是 不可恢复的无效及其 行为未定义。

    替代方案是:

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

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

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

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

    【讨论】:

    • 我主要想知道我是否在 foreach 实例中遗漏了某些东西,但如果无法实现,至少现在已经确认了!感谢您的回答
    【解决方案2】:

    在对集合使用 foreach 循环时,您绝对不能以任何方式更改集合。

    您可以使用 for 循环并自己管理索引或制作集合的副本,并在循环原始集合时,从副本中删除与原始项目相同的项目。

    在这两种情况下,它都不是那么清晰或方便:)。

    【讨论】:

      【解决方案3】:

      如果您只需要删除所有满足条件的项目,您可以使用List<T>.RemoveAll 方法:

      List<string> MyList = new List<string>(new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" });
      MyList.RemoveAll(item => item == "1");
      

      请注意,这会修改初始列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2015-03-03
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        相关资源
        最近更新 更多