Тема: массивы и строки
Массивы.
Давайте начнем с рассмотрения примера создания простого числового массив с элементами типа int. Для этого через ключевое слово new мы объявляем массив, а после, обращаясь к элементам массива по индексу, записываем некоторые числовые значения. Индекс массива начинается с нуля.
Определение одномерных массивов:
int[] k; //k – одномерный массив
k=new int [3]; //Определяем массив из 3-х целых
k[0]=-5; k[1]=4; k[2]=55; //Задаем элементы массива
Элементы массива можно задавать сразу при объявлении: int[] k = {-5, 4, 55};
public void TestDynAr() {
Console.WriteLine("Введите число элементов массива ");
int size = Int32.Parse(Console.ReadLine());
int[] A1 = new int[size];
}
Определение многомерных массивов: int[,] k = new int [2,3];
Обратите внимание, что пара квадратных скобок только одна. Естественно, что в нашем примере у массива 6 (=2*3) элементов (k[0,0] - первый, k[1,2] - последний).
Аналогично мы можем задавать многомерные массивы. Вот пример трехмерного массива:
int[,,] k = new int [10,10,10]; int[,] k = {{2,-2},{3,-22},{0,4}};
При объявлении массива мы должны указать его размер, это обязательно, компилятор выделит фиксированную область в памяти компьютера, в которой будут располагаться элементы массива.
using System;
namespace ArraysTest
{
class Program
{
static void Main(string[] args)
{ // Сокращенная запись
var intArray = new int[4] {5, 20, 30, 10};
foreach (var item in intArray) Console.WriteLine(item);
Console.ReadLine();
} } }
Массивы служат не только для хранения чисел, но и строк и любых других объектов. Объявление таких массив ничем не отличается от объявления числовых массивов, за исключение указания другого типа элементов.
using System;
namespace ArraysTest
{ class Program
{ static void Main(string[] args)
{ var strArray = new string[4] {"Юля", "Таня", "Наташа", "Оля"};
foreach (var item in strArray) Console.WriteLine(item);
Console.ReadLine();
} } }
Массив и цикл foreach
Цикл foreach предназначен для обработки массивов, коллекций и других контейнеров, рассчитанных на хранение множества данных. Оператор имеет такой синтаксис:
foreach (<Элемент> in <Контейнер>) <Тело_цикла>;
Здесь foreach, in — зарезервированные слова; <Элемент> — очередной элемент данных; <Контейнер> — хранилище данных; <Тело_цикла> — произвольный оператор или блок операторов. Разумеется, тип элемента должен совпадать с типом данных в контейнере.
Оператор осуществляет последовательный перебор данных в контейнере и на каждой итерации возвращает очередной элемент в переменной <Элемент>. Эта переменная в теле цикла доступна только для чтения, то есть с помощью цикла нельзя наполнить хранилище данных.
Создадим массив на 100 целых чисел и в цикле for массив наполним случайными целыми числами. Затем в цикле foreach подсчитывается сумма всех элементов массива и находятся минимальный и максимальный его элементы.
using System;
class Class1
{
static void Main()
{
int [] arr = new int[100]; // Массив на 100 целых чисел
Random rnd = new Random(); // Случайное целое число
for (int i = 0; i < 100; i++) // Наполняем массив
arr[i] = rnd.Next();
long Sum = 0; // Сумма элементов
int Min = arr[0], Max = arr[0]; // Максимальный и минимальный элементы
foreach (int i in arr) // Цикл перебора элементов массива
{Sum += i;
if (i > Max)
Max = i;
else if (i < Min)
Min = i; }
Console.WriteLine("Sum = {0} Min = {1} Max = {2}", Sum, Min, Max);
Console.ReadLine();
} }
Пример, который показывает невозможность изменения элементов массива в цикле foreach
var intArray = new int[3] {0, 1, 2};
foreach (var element in intArray)
{ element = 2;
Console.WriteLine(element);}
Console.ReadLine();
Это невозможно, так как в цикле наша переменная element доступна только для чтения. Мы получим ошибку при компиляции нашего кода.
Массив и цикл for
Есть другой способ перебора элементов, это цикл for. Он позволяет не только перебрать элементы массива, но и попутно модифицировать их.
var intArray = new int[3] {0, 1, 2};
for (var i = 0; i < intArray.Length; i++)
{ intArray[i] = intArray[i] + 1; // увеличиваем все элементы на единицу
}
foreach (var item in intArray) Console.WriteLine(item);
Console.ReadLine();
Получение первого элемента
Для получения первого элемента массива, как было сказано выше, мы можем использовать нулевой индекс. Но если массив пуст, то есть элемента с нулевым индексом не существует, то мы получим исключение. Это мы можем сделать с помощью LINQ, применяя метод FirstOrDefault. Это значительно упрощается код. Обратите внимание на подключение дополнительного пространства имен System.Linq.
var array = new int[3] {5, 7, 9};
var first = array.FirstOrDefault();
Console.WriteLine(first);
Console.ReadLine();
Вывод консоли 5
Получение последнего элемента
Последний элемент массива так же возможно получить с помощью индекса. Это можно сделать с помощью свойства Length, которое вернет количество элементов в массиве (размер массива). Чтобы получить индекс последнего элемента, нам придется отнять от полученного размера единицу, так как нумерация элементов начинается с нуля.
var array = new int[3] {5, 7, 9};
var length = array.Length; // размер массива
var last = array[length - 1];
Console.WriteLine(last);
Console.ReadLine();
Вывод консоли 9
То же самое только с помощью LINQ.
var array = new int[3] {5, 7, 9};
var last = array.LastOrDefault();
Console.WriteLine(last);
Console.ReadLine();
Вывод консоли 9
Методы и массивы
Массив может использоваться как параметр для метода и как результат его выполнения. При этом память на копирование и передачу массива не расходуется, так как массив передается с помощью ссылки. Другим словами, изменяя массив, внутри метода, все изменения произойдут и вне его. Рассмотрим пример, где мы передаем в метод массив, изменяем его, возвращаем и на выходе получаем два абсолютно одинаковых массива.
using System;
namespace ArraysTest
{
class Program
{
static void Main(string[] args)
{
var array = new string[2] {"яблоко", "груша"};
var newArray = TestArray(array);
foreach (var item in newArray) Console.WriteLine(item);
Console.ReadLine();
}
// Метод, который принимает и возвращает массив.
static string[] TestArray(string[] input)
{ input[1] = "тыква!";
return input;
}}}
Вывод консоли
яблоко
тыква!
Удаление элементов
Удалить элементы из середины исходного массива невозможно, так как при создании массива выделяется фиксированная область памяти, которую можно либо только уменьшить, либо полностью освободить. Поэтому удалить элементы массива можно только с конца статического метода Resize класса Array.
Пример программы, удаление элементов массива с конца
var array = new int[3] {1, 10, 100};
Array.Resize(ref array, array.Length - 1); // удаляем один элемент с конца
foreach (var item in array) Console.WriteLine(item);
Console.ReadLine();
Вывод консоли 1 10
Ключевое слово ref используется для передачи аргументов по ссылке. В результате все изменения параметра в методе будут отражены в переменной при передаче элемента управления обратно в вызывающий метод.
Пример программы, удаление произвольных элементов массива (C#.NET)
using System;
namespace ArraysTest
{ class Program
{ static void Main(string[] args)
{ var array = new int[3] {1, 10, 100};
var indexToDelete = 1; // индекс элемента, который мы хотим удалить
var output = Delete(array, indexToDelete);
foreach (var item in output) Console.WriteLine(item);
Console.ReadLine();
}
// Метод, который удаляет указанный элемент в массиве и
// возвращает копию массива без этого элемента.
static int[] Delete(int[] array, int indexToDelete)
{
// Проверки, что наш массив не пуст и что указанный индекс существует.
if (array.Length == 0) return array;
if (array.Length <= indexToDelete) return array;
var output = new int[array.Length-1];
int counter = 0;
for (int i = 0; i < array.Length; i++)
{ if (i == indexToDelete) continue;
output[counter] = array[i];
counter++; }
return output;
} } }
Вывод консоли 1 100
Добавление элементов
Чтобы добавить в массив элементы, необходимо предварительно увеличить его размер на количество элементов, которые мы хотим добавить.
var array = new int[3] {1, 10, 100};
Array.Resize(ref array, array.Length + 2); // мы хотим добавить 2 новых элемента
array[3] = 1000;
array[4] = 10000;
foreach (var item in array) Console.WriteLine(item);
Console.ReadLine();
Вывод консоли 1 10 100 1000 10000
Вставка элементов
И конечно, мы можем использовать LINQ для вставки элемента.
var array = new int[3] {1, 10, 100};
var indexToInsert = 1; // индекс, куда мы ходим вставить новый элемент
var newValue = 50; // новый элемент, который вставляем
var list = array.ToList();
list.Insert(indexToInsert, newValue);
var output = list.ToArray();
foreach (var item in output) Console.WriteLine(item);
Console.ReadLine();
Сортировка массива
Сортировку массива можно осуществить как с помощью статического метода Array.Sort так и с помощью LINQ OrderBy.
Строки
Строка в C# — это массив знаков, объявленный с помощью ключевого слова string. Строковый литерал объявляется с помощью кавычек, как показано в следующем примере.
string s = "Hello, World!";
Строки можно целиком переприсваивать:
string s1 = "Hello"; string s2 = s1; //переприсваиваем
Можно объединять строки с помощью оператора +.
Доступ к отдельным знакам
Квадратные скобки [] служат для доступа к отдельным знакам в объекте string, но при этом возможен доступ только для чтения:
string str = "test";
char x = str[2]; // x = 's';
string s5 = "Printing backwards";
for (int i = 0; i < s5.Length; i++)
Console.Write(s5[s5.Length - i - 1]); // напечатается "sdrawkcab gnitnirP"
Извлечение подстрок
Для извлечения подстроки из строки используется метод Substring.
string s3 = "Visual C# Express";
string s4 = s3.Substring(7, 2);
Console.WriteLine(s4); // напечатается "C#"
Замена по образцу
Для замены подстроки в строке по образцу используется метод Replace.
string s3 = "Visual C# Express";
string s5 = s3.Replace("C#", "Basic");
Сonsole.WriteLine(s5); // напечатается "Visual Basic Express"
Смена регистра
Чтобы изменить регистр букв в строке (сделать их заглавными или строчными) следует использовать ToUpper() или ToLower(), как показано в следующем примере:
string s6 = "АлтГТУ";
Console.WriteLine(s6.ToUpper()); // Напечатается АЛТГТУ
Console.WriteLine(s6.ToLower()); // Напечатается алтгту
Console.WriteLine(s6); // Напечатается АлтГТУ
Сравнения
Самый простой способ сравнения двух строк — использовать операторы == и!=, осуществляющие сравнение с учетом регистра:
string color1 = "red";
string color2 = "green";
string color3 = "red";
if (color1 == color3) Console.WriteLine("Строки равны");
if (color1!= color2) Console.WriteLine("Строки не равны");
Не допускается использование >,<,>=,<= для сравнения строк. Для строковых объектов существует метод CompareTo(), возвращающий целочисленное значение, зависящее от того, что одна строка может быть меньше (<), равна (==) или больше другой (>). При сравнении строк используется значение Юникода, при этом значение строчных букв меньше, чем значение заглавных.
string string1 = "ИИТ";
string string2 = "Иит";
int result = string1.CompareTo(string2);
if (result > 0) Console.WriteLine("{0} больше чем {1}", string1, string2);
else if (result == 0)Console.WriteLine("{0} равно {1}", string1, string2);
else if (result < 0) Console.WriteLine("{0} меньше чем {1}", string1, string2);
// Напечатается ИИТ больше чем Иит






