2009-04-08 7 views
6

Supposons le code que j'utilise pour parcourir une liste de nœudspour chaque itération de boucle

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

dans ce cas, l'expression ne node.SelectNodes (« propriété »), s'évalué lors de chaque itération de chaque ou une fois?

+0

Dans quelle langue travaillez-vous? –

+0

J'ai modifié les tags car cela n'a rien à voir avec XML en particulier - c'est juste pour voir comment fonctionne la boucle foreach. Si quelqu'un n'est pas d'accord, n'hésitez pas à revenir. –

Répondre

11

Une seule fois. L'instruction foreach est le sucre syntaxique pour (dans votre cas) ...

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

Ainsi, l'appel réel à SelectNodes() ne se produit une fois.

+0

Il n'est pas lié à cette question spécifique, mais si l'énumérateur est jetable, il sera également éliminé. –

+0

@Marc: Merci! Édité; Je avais oublié –

+0

Salut, Dans ce cas, le code qui est meilleur des deux, for (int i = 0; i

4

On dirait que vous posez des questions sur C#/.NET. L'appel SelectNodes() sera effectué une fois, puis l'énumérateur sera récupéré à partir de la valeur de retour (qui implémente IEnumerable). Cet énumérateur est ce qui est utilisé pendant la boucle, aucun appel ultérieur à SelectNodes() n'est nécessaire.