Вот какой результат дает выполнение этой программы.
Значение элемента равно: О Значение элемента равно: 1 Значение элемента равно: 2 Значение элемента равно: 3 Значение элемента равно: 4 Сумма первых 5 элементов: 10
Совершенно очевидно, что цикл foreach завершается после выбора и вывода значения пятого элемента массива.
Оператор цикла foreach можно также использовать для циклического обращения к элементам многомерного массива. В этом случае элементы многомерного массива возвращаются по порядку следования строк от первой до последней, как демонстрирует приведенный ниже пример программы.
// Использовать оператор цикла foreach для обращения к двумерному массиву.
using System;
class ForeachDemo2 { static void Main() { int sum = 0;
int[,] nums = new int'[3,5];
// Задать первоначальные значения элементов массива nums. for (int i = 0; i < 3; i++) for (int j=0; j < 5; j++) nums[i,j] = (i+l)*(j+l);
// Использовать цикл foreach для вывода значений // элементов массива и подсчета их суммы, foreach(int х in nums) {
Console.WriteLine("Значение элемента равно: " + х); sum += х;
}
Console.WriteLine("Сумма равна: " + sum);
}
}
Выполнение этой программы дает следующий результат.
Значение элемента равно: 1 Значение элемента равно: 2 Значение элемента равно: 3 Значение элемента равно: 4
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Значение
элемента
равно:
Сумма равна: 90
Оператор foreach допускает циклическое обращение к массиву только в определенном порядке: от начала и до конца массива, поэтому его применение кажется, на первый взгляд, ограниченным. Но на самом деле это не так. В большом числе алгоритмов, самым распространенным из которых является алгоритм поиска, требуется именно такой механизм. В качестве примера ниже приведена программа, в которой цикл foreach используется для поиска в массиве определенного значения. Как только это значение будет найдено, цикл прервется.
// Поиск в массиве с помощью оператора цикла foreach.
using System;
class Search {
static void Main() {
int[] nums = new int [10]; int val;
bool found = false;
// Задать первоначальные значения элементов массива nums. for (int i = 0; i < 10; i++) nums[i] = i;
val = 5;
// Использовать цикл foreach для поиска заданного // значения в массиве nums. foreach(int х in nums) { if(x == val) {
found = true; break;
}
}
if(found)
Console.WriteLine("Значение найдено!");
}
}
При выполнении этой программы получается следующий результат.
Значение найдено!
Оператор цикла foreach отлично подходит для такого применения, поскольку при поиске в массиве приходится анализировать каждый его элемент. К другим примерам применения оператора цикла foreach относится вычисление среднего, поиск минимального или максимального значения среди ряда заданных значений, обнаружение дубликатов и т.д. Как будет показано далее в этой книге, оператор цикла foreach оказывается особенно полезным для работы с разными типами коллекций.
Строки
С точки зрения регулярного программирования строковый тип данных string относится к числу самых важных в С#. Этот тип определяет и поддерживает символьные строки. В целом ряде других языков программирования строка представляет собой массив символов. А в C# строки являются объектами. Следовательно, тип string относится к числу ссылочных. И хотя string является встроенным в C# типом данных, его рассмотрение пришлось отложить до тех пор, пока не были представлены классы и объекты.
На самом деле класс типа string уже не раз применялся в примерах программ, начиная с главы 2, но это обстоятельство выясняется только теперь, когда очередь дошла до строк. При создании строкового литерала в действительности формируется строковый объект. Например, в следующей строке кода:
Console.WriteLine("В C# строки являются объектами.");
текстовая строка "В C# строки являются объектами . " автоматически преобразуется в строковый объект средствами С#. Следовательно, применение класса типа string происходило в предыдущих примерах программ неявным образом. А в этом разделе будет показано, как обращаться со строками явным образом.
Построение строк
Самый простой способ построить символьную строку — воспользоваться строковым литералом. Например, в следующей строке кода переменной ссылки на строку str присваивается ссылка на строковый литерал.
string str = "Строки в C# весьма эффективны.";
В данном случае переменная str инициализируется последовательностью символов "Строки в C# весьма эффективны.11.
Объект типа string можно также создать из массива типа char. Например:
char[] charray = {'t', ' е', 's', ' t'};
string str = new string(charray);
Как только объект типа string будет создан, его можно использовать везде, где только требуется строка текста, заключенного в кавычки. Как показано в приведенном ниже примере программы, объект типа string может служить в качестве аргумента при вызове метода WriteLine ().
// Создать и вывести символьную строку.
Using System;
class StringDemo { static void Main() {
char[] charray ={'Э', 'т1, 'o', 1 ', 'с', ' t', 1 p', 'o', 'к', 'a',
1 •1} ;
string strl = new string(charray);
string str2 = "Еще одна строка.";
Console.WriteLine(strl);
Console.WriteLine(str2);
}
}