首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将项添加到循环集合时的Foreach

将项添加到循环集合时的Foreach
EN

Stack Overflow用户
提问于 2009-09-15 08:41:57
回答 7查看 6.5K关注 0票数 2

情况是这样的:

我正在浏览一些代码,我想知道下面的语句是接受所选集合的引用,还是在foreach循环结束时用来替换原始对象的副本。如果是第一个,它会将新找到的页面加入到循环中吗?

代码语言:javascript
运行
复制
foreach(Page page in Pages)
{
    page.AddRange(RetrieveSubPages(page.Id));
}

编辑:对不起,我打错了。

应该是这样的:

代码语言:javascript
运行
复制
foreach(Page page in pages)
{
    pages.AddRange(RetrieveSubPages(page.Id));
}

我想说的是,如果我将一些对象添加到枚举集合中,它会在foreach中联接这些对象吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-15 09:41:59

在回答您的问题时,它不会复制。

它创建一个枚举数并遍历集合。如果在此枚举发生时,在foreach本身中或异步地更改了集合,您将得到一个异常:

mscorlib.dll中出现'System.InvalidOperationException‘类型的未经处理的异常

附加信息:集合已修改;枚举操作可能无法执行。

您可以使用临时集合并在以后连接这两个集合,也可以不使用枚举器。

代码语言:javascript
运行
复制
    for (int i = 0; i < pages.Count; i++)
    {
        test.AddRange(RetrieveSubPages(pages[i].Id));
    }
票数 1
EN

Stack Overflow用户

发布于 2009-09-15 08:47:24

看起来代码并没有修改Pages集合,而是修改了Pages集合中Page对象中对象的内容。至少具有类似集合的方法的Page类型。

一般来说,每个集合都以适合自己的方式实现迭代,并且在迭代时通常是不可修改的,但可以通过获取自身的快照来实现迭代的集合。

没有检测循环退出的机制,这将允许在该点采取操作(考虑这将如何与循环主体中的异常、中断和返回进行交互)。

票数 5
EN

Stack Overflow用户

发布于 2009-09-15 08:46:55

在大多数情况下,foreach针对实时集合(无显式克隆)工作,如果您在枚举集合时尝试更改集合,则枚举器会中断并引发异常。因此,如果您要添加到Pages中,请预料到会出现问题。

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

https://stackoverflow.com/questions/1425932

复制
相关文章

相似问题

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