C# 在循环遍历集合时修改集合时获取InvalidOperationException

C# 在循环遍历集合时修改集合时获取InvalidOperationException,c#,exception,C#,Exception,我有一个集合,比如说整数列表,并使用foreach在其中循环,但是如果我必须在循环过程中向列表中插入数据,我该怎么做呢?我要走了 未处理的异常:System.InvalidOperationException:集合已被删除 不能执行修改后的枚举操作 这是下面的示例代码。我认为AsReadonly()将返回一个在modified state之前的集合。这里的情况并非如此 ints = new List<int>(30); ints.AddRange(Enumerable.Range(1

我有一个集合,比如说整数列表,并使用foreach在其中循环,但是如果我必须在循环过程中向列表中插入数据,我该怎么做呢?我要走了

未处理的异常:System.InvalidOperationException:集合已被删除 不能执行修改后的枚举操作

这是下面的示例代码。我认为AsReadonly()将返回一个在modified state之前的集合。这里的情况并非如此

ints = new List<int>(30);
ints.AddRange(Enumerable.Range(1, 10));
int y = 11;

foreach(int x in ints.AsReadOnly())
{
    ints.Add(y++);
    Console.WriteLine(x);
}
ints=新列表(30);
ints.AddRange(可枚举范围(1,10));
int y=11;
foreach(ints.AsReadOnly()中的int x)
{
整数加(y++);
控制台写入线(x);
}

foreach
循环中,不能修改集合。尝试改用
for
-循环。

foreach
循环内不能修改集合。尝试使用
for
-循环。

因为状态
AsReadonly()
只是原始集合上的包装,所以您仍然在同一集合上操作-应用相同的规则

只读集合只是带有包装器的集合 防止修改集合;因此,如果进行了更改, 对于基础集合,只读集合反映了 更改。

由于states
AsReadonly()
只是原始集合上的一个包装器,因此您仍然在同一集合上操作-应用相同的规则

只读集合只是带有包装器的集合 防止修改集合;因此,如果进行了更改, 对于基础集合,只读集合反映了 更改。


AsReadOnlyMethod()返回一个禁止修改的包装器列表,它仍然是相同的列表

AsReadOnlyMethod()返回一个禁止修改的包装器列表,它仍然是相同的列表

正如其他人提到的
AsReadonly()
仅在原始列表周围生成一个包装器

像这样的东西会有用的。但我不知道你想做什么,所以可能没有帮助

var ints = new List<int>();
ints.AddRange(Enumerable.Range(1, 10));
int y = 11;

var moreInts = new List<int>();

foreach(int x in ints.AsReadOnly())
{
    moreInts.Add(y++);
    Console.WriteLine(x);
}

ints.AddRange(moreInts);
var ints=new List();
ints.AddRange(可枚举范围(1,10));
int y=11;
var moreInts=新列表();
foreach(ints.AsReadOnly()中的int x)
{
添加(y++);
控制台写入线(x);
}
整数AddRange(moreInts);

正如其他人提到的
AsReadonly()
仅在原始列表周围生成一个包装器

像这样的东西会有用的。但我不知道你想做什么,所以可能没有帮助

var ints = new List<int>();
ints.AddRange(Enumerable.Range(1, 10));
int y = 11;

var moreInts = new List<int>();

foreach(int x in ints.AsReadOnly())
{
    moreInts.Add(y++);
    Console.WriteLine(x);
}

ints.AddRange(moreInts);
var ints=new List();
ints.AddRange(可枚举范围(1,10));
int y=11;
var moreInts=新列表();
foreach(ints.AsReadOnly()中的int x)
{
添加(y++);
控制台写入线(x);
}
整数AddRange(moreInts);

您需要使用无法修改的列表副本。这项工作:

foreach(int x in ints.ToArray())
{
    ints.Add(y++);
    Console.WriteLine(x);
}
这本书当然不好看。在这种特殊情况下,由于只添加元素,因此可以使用for()循环避免复制:

int count=int.count;
对于(int-ix=0;ix
您需要使用无法修改的列表副本。这项工作:

foreach(int x in ints.ToArray())
{
    ints.Add(y++);
    Console.WriteLine(x);
}
这本书当然不好看。在这种特殊情况下,由于只添加元素,因此可以使用for()循环避免复制:

int count=int.count;
对于(int-ix=0;ix
出于好奇?上面剪的是什么?我这样问是因为在不了解您的实际用例的情况下,甚至不可能向您建议一种替代方法。出于好奇,可能会复制吗?上面剪的是什么?我这样问是因为在不了解您的实际用例的情况下,甚至不可能向您建议一种替代方法。它的可能副本不是装饰器-更可能是装饰器。@Jonathan:是的,您是对的-装饰器不适用,因为接口实际上是不同的(因为它不允许修改)它不是一个装饰器-更可能是一个。@Jonathan:是的,你是对的-装饰器不适用,因为接口实际上是不同的(因为它不允许修改),你不能修改你正在迭代的集合。但是您可以修改另一个集合,这使得注释中提到的
ToArray()
方法成为可能。您不能修改正在迭代的集合。但是您可以修改另一个集合,这使得Hans在评论中提到的
ToArray()
方法成为可能。