在循环中修改集合时获取InvalidOperationException

时间:2011-09-11 15:50:49

标签: c# exception

我有一个集合可以说整数列表并使用foreach循环遍历它,但是如果我必须在循环期间将数据插入到列表中,我该怎么做?我正在

  

未处理的异常:System.InvalidOperationException:Collection是   修改后的枚举操作可能无法执行。

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

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);
}

5 个答案:

答案 0 :(得分:2)

您需要使用无法修改的列表副本。这有效:

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

副本当然令人不快。在这种特殊情况下,由于您只是添加元素,因此可以使用for()循环来避免复制:

int count = ints.Count;
for (int ix = 0; ix < count; ++ix) {
    ints.Add(y++);
    Console.WriteLine(ints[ix]);
}

答案 1 :(得分:1)

由于documentation状态AsReadonly()只是原始集合上的包装,因此您仍然在同一个集合上运行 - 适用相同的规则。

  

只读集合只是一个带有包装器的集合   这会阻止修改集合;因此,如果进行了更改   对于底层集合,只读集合反映了这些集合   变化。

答案 2 :(得分:1)

正如其他人提到的那样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);

答案 3 :(得分:0)

您无法在foreach循环内修改集合。尝试使用for - 循环代替。

答案 4 :(得分:0)

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