对于每个循环迭代

时间:2009-04-08 13:28:56

标签: c# enumeration

让我们假设我用来迭代节点列表的代码

foreach(XmlNode nodeP in node.SelectNodes("Property"))
{
  propsList.Add(nodeP.Attributes["name"].Value, true);
}

在这种情况下是否运行表达式node.SelectNodes(“Property”),在每次迭代期间为每个或一次进行评估?

2 个答案:

答案 0 :(得分:11)

只有一次。 foreach语句是(在你的情况下)......的语法糖...

{
    IEnumerator<XmlNode> enumerator = node.SelectNodes("Property").GetEnumerator();

    XmlNode nodeP;

    while(enumerator.MoveNext())
    {
        nodeP = enumerator.Current;

        propsList.Add(nodeP.Attributes["name"].Value, true);
    }

    IDisposable disposable = enumerator as IDisposable;

    if(disposable != null) disposable.Dispose();
}

因此,对SelectNodes()的实际调用只发生一次。

答案 1 :(得分:4)

看起来你在询问C#/ .NET。 SelectNodes()调用将进行一次,然后将从返回值(实现IEnumerable)中检索枚举数。该枚举器是循环期间使用的,不需要后续调用SelectNodes()。