C# 在循环遍历集合时修改集合时获取InvalidOperationException
我有一个集合,比如说整数列表,并使用foreach在其中循环,但是如果我必须在循环过程中向列表中插入数据,我该怎么做呢?我要走了 未处理的异常:System.InvalidOperationException:集合已被删除 不能执行修改后的枚举操作 这是下面的示例代码。我认为AsReadonly()将返回一个在modified state之前的集合。这里的情况并非如此C# 在循环遍历集合时修改集合时获取InvalidOperationException,c#,exception,C#,Exception,我有一个集合,比如说整数列表,并使用foreach在其中循环,但是如果我必须在循环过程中向列表中插入数据,我该怎么做呢?我要走了 未处理的异常:System.InvalidOperationException:集合已被删除 不能执行修改后的枚举操作 这是下面的示例代码。我认为AsReadonly()将返回一个在modified state之前的集合。这里的情况并非如此 ints = new List<int>(30); ints.AddRange(Enumerable.Range(1
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()
只是原始集合上的包装,所以您仍然在同一集合上操作-应用相同的规则
只读集合只是带有包装器的集合
防止修改集合;因此,如果进行了更改,
对于基础集合,只读集合反映了
更改。
由于statesAsReadonly()
只是原始集合上的一个包装器,因此您仍然在同一集合上操作-应用相同的规则
只读集合只是带有包装器的集合
防止修改集合;因此,如果进行了更改,
对于基础集合,只读集合反映了
更改。
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()
方法成为可能。