我有一个集合--例如整数列表,并使用foreach循环遍历它,但是如果必须在循环期间将数据插入到列表中,我如何做到呢?我得到了
未处理的异常: System.InvalidOperationException:集合已被修改,枚举操作可能不会执行。
这是下面的示例代码。我认为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);
}发布于 2011-09-11 16:09:18
正如其他人所提到的,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);发布于 2011-09-11 16:24:54
您需要使用无法修改的列表副本。这样做是可行的:
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]);
}发布于 2011-09-11 16:02:16
由于文档状态下,AsReadonly()只是原始集合的包装器,所以您仍然在相同的集合上操作--适用相同的规则。
只读的集合只是一个包含防止修改集合的包装器的集合;因此,如果对基础集合进行更改,则只读集合反映这些更改。
https://stackoverflow.com/questions/7379367
复制相似问题