Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中使用foreach循环时修改集合#_C#_Python_Invalidoperationexception - Fatal编程技术网

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

C# 在c中使用foreach循环时修改集合#,c#,python,invalidoperationexception,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#中执行类似操作时,我遇

基本上,我希望在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);
    }
  }
static void Main(字符串[]args)
{
List MyList=新列表(新字符串[]{“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”});
foreach(MyList中的字符串项)
{
如果(MyList.IndexOf(Item)==0)
{
MyList.RemoveAt(1);
}
控制台写入线(项目);
}
}

提前谢谢

你不能这样做。从以下文件:

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

备选方案包括:

  • 建立要删除的项目的新列表,然后将其全部删除
  • 使用一个普通的“for”循环,并确保小心不要在同一个元素上重复两次或遗漏任何内容。(你说过你不想这样做,但你想做的事就是行不通。)
  • 构建仅包含要保留的元素的新集合
最后一个备选方案是类似LINQ的解决方案,您通常会在其中写道:

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

(当然,
shouldbeetained
是您想要的任何逻辑。)只有当您确实想要在列表中调用
ToList()
时,才需要调用它。这将导致更多的声明性代码,通常更易于阅读。我很难猜出你原来的循环是用来做什么的(目前看起来很奇怪),但是如果你能纯粹用项目来表达逻辑,它会更清晰。

在集合上使用foreach循环时,你肯定不会以任何方式更改它

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


在这两种情况下都不太清楚或方便:)。

如果您只需要删除满足条件的所有项目,您可以使用以下方法:

List MyList=新列表(新字符串[]{“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”);
MyList.RemoveAll(item=>item==“1”);

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

我主要想知道foreach实例是否遗漏了某些内容,但如果无法实现,至少现在已经确认了!谢谢你的回答
List<string> MyList = new List<string>(new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" });
MyList.RemoveAll(item => item == "1");