C#. Цикл foreach. Призначення. Приклади використання




Цикл foreach. Призначення. Приклади використання


Зміст


Пошук на інших ресурсах:

1. Призначення циклу foreach. Загальна форма

Оператор циклу foreach призначений для перебору елементів колекції або масиву. Загальна форма оператора foreach наступна

foreach(type identifier in container)
{
  // оператори
  // ...
}

де

  • type – тип змінної з іменем identifier;
  • identifier – ім’я змінної, яка використовується в якості ітератора. Змінна identifier набуває значення наступного елементу циклу на кожному кроці виконання циклу foreach. Тип змінної identifier повинен співпадати з типом масиву або колекції container. Зв’язок між ідентифікатор та контейнер реалізується з допомогою союзу in;
  • container – ім’я колекції або масиву, який переглядається.

Оператор циклу foreach працює наступним чином. При входженні в цикл змінній identifier присвоюється перший елемент масиву (колекції) container. На кожному наступному кроці ітерації вибирається наступний елемент з container, який зберігається у змінній identifier. Цикл завершується, коли буде переглянуто усі елементи масиву (колекції) container.

 

2. Приклади використання оператора циклу foreach для масивів
2.1. Обчислення суми елементів масиву типу double

У прикладі розв’язана задача обчислення суми елементів масиву типу double. Текст програми, створеної за шаблоном Console Application наступний.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // оголосити масив типу double, виділити пам'ять для масиву
      double[] A = new double[10];
      Random rnd_num = new Random();

      // заповнити масив випадковими числами в діапазоні від 0 до 20
      for (int i = 0; i < A.Length; i++)
      {
        A[i] = rnd_num.NextDouble() * 20;
      }

      // вивести масив для перевірки
      Console.WriteLine("Array A:");
      for (int i = 0; i < A.Length; i++)
      {
        Console.Write("{0:f3} ", A[i]);
      }
      Console.WriteLine();

      // Використання циклу foreach для обчислення суми елементів масиву
      double summ = 0;
      foreach (double item in A)
      {
        summ += item;
      }

      Console.WriteLine("summ = {0:f3}", summ);
      Console.ReadKey();
    }
  }
}

 Результат роботи програми

Array A:
7,117 1,218 9,963 13,038 17,656 9,593 5,876 9,802 3,305 2,546
summ = 80,114


 

2.2. Пошук максимального значення в масиві

У прикладі продемонстровано обхід цілочисельного масиву з допомогою оператора циклу foreach.

Приклад.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // масив з 10 чисел типу int
      int[] A = new int[10];
      int max = 0; // шукане максимальне значення
      bool f_first; // перший елемент в масиві
      Random rnd_num = new Random(); // випадкове число

      // 1. Заповнити масив випадковими числами
      for (int i = 0; i < A.Length; i++)
      {
        A[i] = rnd_num.Next(0, 20);
      }

      // 2. Вивід масиву для контролю
      for (int i = 0; i < A.Length; i++)
        Console.Write("{0} ", A[i]);
      Console.WriteLine();

      // 3. Цикл foreach
      f_first = true; // ознака першого елементу в масиві
      foreach (int item in A)
      {
        if (f_first) // якщо перший елемент в масиві
        {
          max = item; // то запам'ятати його безумовно
          f_first = false;
        }
        else
        {
          if (max < item)
            max = item;
        }
      }

      // 3. Вивід результату
      Console.WriteLine("max = {0}", max);

      Console.ReadKey();
    }
  }
}

Результат роботи програми

3 10 4 15 3 1 6 10 15 14
max = 15

 

3. Приклади використання циклу foreach для колекцій
3.1. Приклад роботи з колекцією ArrayList. Визначення мінімального елементу в колекції дійсних чисел

Текст програми для додатку типу Console Application наступний

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // Цикл foreach, колекція ArrayList
      ArrayList AL = new ArrayList(); // створити колекцію з 10 елементів
      Random rnd_num = new Random();

      // 1. Записати в колекцію випадкові дійсні числа від 0 до 10
      for (int i = 0; i < 10; i++)
      {
        AL.Add(rnd_num.NextDouble() * 10); // додати
      }

      // 2. Вивести колекцію на екран для перевірки, використати цикл foreach
      foreach (double x in AL)
      {
        Console.Write("{0:f2} ", x);
      }
      Console.WriteLine();

      // 3. Визначення мінімального елементу колекції
      double min = 0;
      bool f_first = true;

      foreach (double x in AL)
      {
        if (f_first)
        {
          min = x;
          f_first = false;
        }
        else
        {
          if (min > x) min = x;
        }
      }

      // 4. Вивід результату
      Console.WriteLine("min = {0:f2}", min);

      Console.ReadKey();
    }
  }
}

Результат роботи програми

8,13 7,47 3,23 5,98 9,43 1,65 0,27 7,82 0,79 2,85
min = 0,27

 

3.2. Приклад роботи з колекцією Hashtable

У прикладі реалізовано пошук даних за заданим ключем з допомогою циклу foreach. Пошук реалізовано для даних колекції типу Hashtable. Спочатку формується масив ключів типу int та значень типу double, які відповідають цим ключам.

Текст додатку для типу Console Application наступний

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Цикл foreach, колекція Hashtable
      Hashtable ht = new Hashtable(); // створити колекцію
      Random rnd_value = new Random(); // випадкове значення
      int key;
      double value;

      // 1. Цикл формування ключів та записів
      for (int i = 0; i < 8; i++)
      {
        key = i; // отримати ключ
        value = rnd_value.NextDouble(); // взяти випадкове значення
        ht.Add(key, value); // додати до таблиці
      }

      // 2. Вивести таблицю на екран
      // Цикл foreach
      ICollection ic = ht.Keys; // отримати колекцію ключів
      foreach (Object k in ic) // використати ключ для пошуку значення
      {
        // вивести пару ключ-значення
        Console.Write("{0}-{1:f1}, ", k, ht[k]);
      }
      Console.WriteLine();

      // 3. Ввід ключа, за яким потрібно отримати дані
      int fkey;
      Console.Write("Enter key: ");
      fkey = Convert.ToInt32(Console.ReadLine());

      // 4. Пошук даних за ключем, цикл foreach
      bool f_find = false;
      foreach (Object k in ic) // перебір ключів
      {
        if ((int)k == fkey) // чи знайдено ключ?
        {
          value = (double)ht[k]; // отримати значення по ключу
          f_find = true;
          Console.WriteLine("Key = {0}, data = {1:f1}", k, value);
          break; // дані знайдено, немає сенсу продовжувати цикл
        }
      }

      if (!f_find)
        Console.WriteLine("Key is wrong.");
      Console.ReadKey();
    }
  }
}

Результат виконання програми

7-0.3, 6-0.5, 5-0.0, 4-0.6, 3-0.9, 2-0.8, 1-0.6, 0-1.0,
Enter key: 4
Key = 4, data = 0.6

 

4. Застосування оператора foreach для двовимірного масиву

Оператор циклу foreach може використовуватись для двовимірних та багатовимірних масивів. У цьому випадку елементи масиву розглядаються в порядку читання рядків, від першого до останнього.

У прикладі обчислюється сума елементів двовимірного масиву типу float.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // 1. Створити двовимірний масив
      float[,] AF = new float[3, 4];
      float sum = 0; // шукана сума

      // 2. Заповнити масив значеннями
      Random rnd_num = new Random();

      for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
        {
          AF[i, j] = (float)rnd_num.NextDouble() * 5; // числа від 0 до 5
        }

      // 3. Вивести масив для перевірки
      Console.WriteLine("Array AF: ");
      for (int i = 0; i < 3; i++)
      {
        for (int j = 0; j < 4; j++)
          Console.Write("{0:f1} ", AF[i, j]);
        Console.WriteLine();
      }

      // 4. Обчислити суму з допомогою циклу foreach
      foreach (float x in AF)
      {
        sum += x;
      }

      // 5. Вивести суму
      Console.WriteLine("summ = {0:f1}", sum);

      Console.ReadKey();
    }
  }
}

Результат роботи програми

Array AF:
1.5 0.5 2.3 4.2
0.6 4.3 1.4 3.7
1.2 4.9 1.9 4.4
summ = 31.0

 

5. Особливості застосування оператору break в циклі foreach. Приклад

З допомогою оператора break можна перервати виконання циклу foreach. Як правило, переривання циклу здійснюється при виконанні деякої умови.

Приклад. Пошук в масиві заданого числа.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // Пошук в масиві заданого числа
      // оголосити масив типу int, виділити пам'ять для масиву
      int[] A = new int[10];
      int number; // число, яке шукається в масиві A
      Random rnd_num = new Random(); // екземпляр класу Random

      // Сформувати масив A випадково
      for (int i = 0; i < A.Length; i++)
        A[i] = rnd_num.Next(0, 20);

      // Вивести масив A
      Console.WriteLine("Array A: ");
      for (int i = 0; i < A.Length; i++)
        Console.Write("{0} ", A[i]);
      Console.WriteLine();

      // Ввести число, яке потрібно перевірити
      Console.Write("Enter number: ");
      number = Convert.ToInt32(Console.ReadLine());

      // Використання циклу foreach та оператору break
      bool f_is = false;
      foreach (int item in A)
      {
        if (number == item)
        {
          f_is = true;
          break; // вихід з циклу, подальше виконання циклу не має сенсу
        }
      }

      if (f_is)
        Console.WriteLine("Item {0} is in array A.", number);
      else
        Console.WriteLine("Item {0} is not in array A.", number);
      Console.ReadKey();
    }
  }
}

У вищенаведеній програмі продемонстровано використання оператора break в циклі foreach. Як тільки шукане значення number зустрінеться в масиві A, то немає сенсу виконувати наступні ітерації.

Результат роботи програми

Array A:
11 15 13 6 4 18 8 18 0 4
Enter number: 8
Item 8 is in array A.

 

6. Застосування оператора foreach з рядками. Приклад

Розробити програму, яка обчислює кількість входжень заданого символу в заданому тексті.

Текст програми, створеної за шаблоном Console Application наступний

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Підрахунок заданого символу в тексті
      string str;
      char symbol;
      int count = 0; // кількість символів

      // 1. Ввести текст
      Console.WriteLine("Enter text: ");
      str = Console.ReadLine();

      // 2. Ввести символ
      Console.Write("Enter symbol: ");
      symbol = (char)Console.Read();

      // 3. Використання циклу foreach
      foreach(char c in str)
        if (c == symbol) count++;

      // 4. Вивести результат
      Console.WriteLine("count = {0}", count);
      Console.ReadKey();
    }
  }
}

Результат виконання програми

Enter text:
bestprog.net
Enter symbol: t
count = 2

 

7. Вкладені цикли foreach. Приклад

Цикли foreach можуть бути вкладеними.

Приклад. Задано масив рядків. У масиві рядків обчислити кількість символів ‘+’.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Обчислення кількості входжень символу '+' в масиві рядків
      string[] S; // посилання на масив рядків
      int count;

      // 1. Ввести кількість рядків
      Console.Write("Enter number of strings: ");
      count = Convert.ToInt32(Console.ReadLine());

      // 2. Виділення пам'яті для масиву рядків
      S = new string[count];

      // 3. Ввести рядки
      Console.WriteLine("Enter strings: ");
      for (int i = 0; i < count; i++)
        S[i] = Console.ReadLine();

      // 4. Обчислення з використанням вкладених циклів foreach
      count = 0;
      foreach (string str in S) // перебір рядків
      {
        foreach (char c in str) // перебір символів у рядку
        {
          if (c == '+')
            count++;
        }
      }

      Console.WriteLine("count = {0}", count);
      Console.ReadKey();
    }
  }
}

Результат виконання програми

Enter number of strings: 4
Enter strings:
a+5=25
b-8-c+d = 333
c+d+f*d=248
abc+def=abcdef
count = 5

 

8. Переваги та недоліки оператора циклу foreach у порівнянні з іншими операторами циклу

Можна виділити наступні переваги циклу foreach:

  • спрощеність синтаксичної конструкції циклу;
  • змінній-ітератору не потрібно задавати початкове значення, вказувати приріст;
  • не потрібно вказувати умову завершення циклу.

Недоліки:

  • не можна переглядати елементи масиву або колекції у зворотньому порядку. Для деяких задач це важливо;
  • змінна-ітератор не може розглядати вибіркові елементи масиву або колекції, наприклад, розглядати елементи колекції, які лежать на парних позиціях. Однак, цей недолік є умовним, оскільки можна використати різні додаткові змінні (прапорці) для отримання доступу до потрібних елементів.

 


Зв’язані теми

 


 

0
fb-share-icon20