我有一个集合可以说整数列表并使用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);
}
答案 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()返回一个禁止修改的包装列表,它仍然是相同的列表。