2

我的问题是,当我使用 for 循环遍历一个列表并在此期间向其中添加元素时,它是否计算循环时添加的元素?简单的代码示例:

for (int i = 0; i < listOfIds.Count(); i++) // Does loop counts the items added below?
{
    foreach (var post in this.Collection)
    {
        if (post.ResponsePostID == listOfIds.ElementAt(i))
        {
            listOfIds.Add(post.PostId); // I add new item to list in here
        }
    }
}

我希望我的解释足以让您理解我的问题。

4

4 回答 4

8

是的,通常是这样。但是在迭代集合的同时更改集合可能会导致奇怪的行为和难以发现的错误。根本不推荐。

于 2013-06-25T09:11:35.213 回答
0

是的,它肯定会。内部 foreach 循环将执行并将元素添加到外部集合中,从而增加元素的计数。

listOfIds.Count=2 //迭代1

listOfIds.Add(//元素)

当再次进入 for 循环时

listOfIds.Count=3 //迭代2

于 2013-06-25T09:20:20.273 回答
0

作为对for循环的略微删节的解释。您实际上是在定义以下内容:

for (initializer; condition; iterator)
body

你的initializer意志将建立你的初始条件,并且只会发生一次(有效地在循环之外)。

每次都会对您condition进行评估,以确定您的循环是否应该再次运行,或者干脆退出。

iterator定义了循环中每次迭代后将发生的操作。

因此,在您的情况下,您的循环listOfIds.Count();每次都会重新评估,以决定它是否应该执行;这可能是也可能不是您想要的行为。

正如丹尼斯指出的那样,如果你不小心,你可能会让自己陷入混乱(你的循环可能会无限运行)。

可以在 msdn 上找到更详细/更好的书面解释:http: //msdn.microsoft.com/en-us/library/ch45axte.aspx

于 2013-06-25T09:20:27.757 回答
0

如果您希望此循环仅针对预添加的项目计数运行,请执行此操作

int nLstCount =  listOfIds.Count();
for (int i = 0; i < nLstCount ; i++) 
{
foreach (var post in this.Collection)
{
    if (post.ResponsePostID == listOfIds.ElementAt(i))
    {
        listOfIds.Add(post.PostId);
    }
}
}
于 2013-06-25T09:11:07.023 回答