首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在修改集合时获得InvalidOperationException,同时遍历集合

在修改集合时获得InvalidOperationException,同时遍历集合
EN

Stack Overflow用户
提问于 2011-09-11 15:50:49
回答 5查看 386关注 0票数 0

我有一个集合--例如整数列表,并使用foreach循环遍历它,但是如果必须在循环期间将数据插入到列表中,我如何做到呢?我得到了

未处理的异常: System.InvalidOperationException:集合已被修改,枚举操作可能不会执行。

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

代码语言:javascript
复制
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);
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-11 16:09:18

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

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

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2011-09-11 16:24:54

您需要使用无法修改的列表副本。这样做是可行的:

代码语言:javascript
复制
foreach(int x in ints.ToArray())
{
    ints.Add(y++);
    Console.WriteLine(x);
}

当然,这份副本令人不快。在这种情况下,由于只添加元素,所以可以通过使用for()循环来避免复制:

代码语言:javascript
复制
int count = ints.Count;
for (int ix = 0; ix < count; ++ix) {
    ints.Add(y++);
    Console.WriteLine(ints[ix]);
}
票数 2
EN

Stack Overflow用户

发布于 2011-09-11 16:02:16

由于文档状态下,AsReadonly()只是原始集合的包装器,所以您仍然在相同的集合上操作--适用相同的规则。

只读的集合只是一个包含防止修改集合的包装器的集合;因此,如果对基础集合进行更改,则只读集合反映这些更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7379367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档