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();
}