C# 对于每个循环迭代

C# 对于每个循环迭代,c#,enumeration,C#,Enumeration,让我们假设我用来遍历节点列表的代码 foreach(XmlNode nodeP in node.SelectNodes("Property")) { propsList.Add(nodeP.Attributes["name"].Value, true); } 在本例中,表达式node.SelectNodes(“属性”)是否在的每次迭代过程中都会得到一次或一次计算?仅一次。foreach语句是(在您的情况下)的语法糖 { IEnumerator枚举器=节点。SelectNodes(“属性”)

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

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

在本例中,表达式node.SelectNodes(“属性”)是否在的每次迭代过程中都会得到一次或一次计算?

仅一次。foreach语句是(在您的情况下)的语法糖

{
IEnumerator枚举器=节点。SelectNodes(“属性”).GetEnumerator();
xmlnodep;
while(枚举数.MoveNext())
{
nodeP=枚举数。当前;
添加(nodeP.Attributes[“name”].Value,true);
}
IDisposable disposable=作为IDisposable的枚举器;
if(disposable!=null)Dispose.Dispose();
}

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

看起来您是在询问有关C#/.NET的问题。SelectNodes()调用将执行一次,然后从返回值(实现IEnumerable)检索枚举数。循环过程中使用的是该枚举数,不需要后续调用SelectNodes()。

您使用的是哪种语言?我编辑了标记,因为这与XML无关,只是与foreach循环的工作方式有关。如果有人不同意,请随时回复。这与此特定问题无关,但如果枚举器是一次性的,它也会被处理。@Marc:谢谢!编辑;我忘记了,在这种情况下,哪种代码比这两种代码好,对于(inti=0;I{ 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(); }