за каждую итерацию цикла

Предположим, код, который я использую для перебора списка узлов

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

в этом случае выражение node.SelectNodes("Property") оценивается во время каждой итерации для каждого или один раз?


person Sidhartha Shenoy    schedule 08.04.2009    source источник
comment
На каком языке вы работаете?   -  person Ryan Guill    schedule 08.04.2009
comment
Я отредактировал теги, потому что это не имеет ничего общего с XML - это просто связано с тем, как работает цикл foreach. Если кто-то не согласен, не стесняйтесь возвращаться.   -  person Jon Skeet    schedule 08.04.2009


Ответы (2)


Только однажды. Оператор 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() происходит только один раз.

person Adam Robinson    schedule 08.04.2009
comment
Это не связано с этим конкретным вопросом, но если счетчик одноразовый, он тоже будет удален. - person Marc Gravell; 08.04.2009
comment
@Марк: Спасибо! Отредактировано; я забыл об этом - person Adam Robinson; 08.04.2009
comment
Привет. В таком случае, какой из двух кодов лучше, for(int i = 0; i ‹ StudentArray.Length; studentArray++) { } - person Sidhartha Shenoy; 09.04.2009
comment
Привет, В таком случае, какой код лучше из двух, for(int i = 0; i ‹ StudentArray.Length; studentArray++) { // сделать что-то } of int count = StudentArray.Length; for(int i = 0; i ‹ count ; studentArray++) { // делаем что-то } - person Sidhartha Shenoy; 09.04.2009
comment
Я предполагаю, что вы имели в виду i++, а не studentArray++. Во всяком случае, теоретически преимущество перед последним было бы, но я сомневаюсь, что вы когда-либо его видели. Просто придерживайтесь простого подхода и делайте первое. - person Adam Robinson; 09.04.2009

Похоже, вы спрашиваете о С#/.NET. Вызов SelectNodes() будет выполнен один раз, а затем перечислитель будет извлечен из возвращаемого значения (которое реализует IEnumerable). Этот перечислитель используется во время цикла, никаких последующих вызовов SelectNodes() не требуется.

person allgeek    schedule 08.04.2009