Поиск

Оператор foreach

Некоторые языки, такие как Visual Basic, давно имеют специальные операторы для итерации массивов и наборов. В С# тоже есть такая конструкция — оператор foreach:
foreach (тип in выражение) встроенный _оператор
Рассмотрим следующий класс-массив:

class MyArray
<
public ArrayList words;
public MyArrayO {
words = new ArrayListO;
words.Add("foo");
words.Add("bar");
words.Add("baz"); } }

Познакомившись с итерационными операторами, вы понимаете, что пройти по массиву можно по-разному. Но для большинства Java- и С++-программистов наиболее логичным будет такой способ:

using System;
using System.Collections;
class MyArray
{
public ArrayList words;
public MyArrayO {
words = new ArrayListQ;
words.Add("foo");
words.Add("bar");
words.Add("baz"); } }
class ForeacMApp {
public static void Nain()
{
HyArray myArray = new MyArrayO;
for (int 1=0; i < myArray.words.Count; i++) {
Console.WriteLine("{0}", myArray.wordsfi]); } > }

Но такой подход обременен потенциальными проблемами:

  • если переменная цикла for проинициализирована некорректно, итерация всего списка будет невозможной;
  • если неверно булевское выражение оператора for, итерация всего списка будет невозможной;
  • если неверно приращение цикла, итерация всего списка будет невозможной;
  • у совокупностей и массивов разные методы и свойства для доступа к их счетчикам;
  • семантика выделения конкретного элемента из совокупности и массива различна;
  • во встроенном операторе цикла for при выделении элемента для него нужна переменная соответствующего типа.

Источников потенциальных проблем масса. Используя оператор foreach, этих проблем можно избежать и единообразно производить итерацию наборов и массивов. С оператором foreach предыдущий пример можно переписать так:

using System;
using System.Collections;
class MyArray
{
public ArrayList words;
public MyArrayO {
words = new ArrayListO;
words.Add("foo");
words.Add("bar");
words.Add("baz"); } }
class Foreach2App
{
public static void Main()
{
MyArray myArray = new MyArrayO;
foreach (string word in myArray.words)
{
Console.WriteLine("{0>", word);
} } }

Насколько понятней оператор foreaM Вы гарантированно получите каждый элемент, поскольку вам не потребуется вручную устанавливать цикл и запрашивать счетчик, а оператор, содержащийся в цикле, автоматически поместит элемент в указанную вами переменную — достаточно лишь сослаться на нее в этом операторе.