Массивы, коллекции и цикл foreach

Наверняка вы уже заметили нечто странное во всех этих примерах - их невозможно использовать для работы с большими объемами данных. Как хранить информацию о тысячах людей или точек на экране? Два базовых инструмента - массивы и коллекции разных типов, наиболее простым и распространенным из которых являются списки. Как несложно догадаться и то и то является классами, и то и то представляет собой набор значений, к которым можно обращаться по номеру-индексу, начинающемуся с нуля.

int[] intArray = new int[5];

int[,] multiDimensionalIntArray = new int[2, 3];

Person[] personsArray = new Person[2];

personsArray[0] = new Person("Пушкин", "Александр", "Сергеевич");

personsArray[1] = new Person("Гончарова", "Наталья", "Николаевна");

Console.WriteLine(personsArray.Count()); // выведет 2

Console.WriteLine(personsArray[1].Fio); // выведет Гончарова Наталья Николаевна

List<Person> personsList = new List<Person>();

personsList.Add(new Person("Пушкин", "Александр", "Сергеевич"));

personsList.Add(new Person("Гончарова", "Наталья", "Николаевна"));

System.Console.WriteLine(personsList.Count()); // выведет 2

System.Console.WriteLine(personsList[0].Fio); // выведет Пушкин Александр Сергеевич

for (int counter = 0; counter <= 1; counter++)

{

Console.WriteLine(personsList[counter].FioInitials);

}

В чем же отличие массивов от списков? Подробности относятся к продвинутым знаниям, но в целом под массив место в памяти выделяется сразу и если надо изменить его размер, то место приходится выделять заново. Под список фиксированный объем не выделяется, он меняется динамически, но операции над элементами выполняются медленнее. Таким образом массив быстрее и лучше работает, если количество элементов не меняется, список - если меняется. Но в большинстве случаев эта разница в скорости не заметна на фоне других факторов. Продвинутые программисты хорошо понимают разницу между ArrayList, Dictionary, HashSet, LinkedList, Collection и другими типами коллекций.

Обходить все элементы в каком-то множестве приходится так часто, что в большинстве современных языков для этого сделали особый цикл, в C# это цикл foreach, "для каждого".

foreach (Person currPerson in personsList)

{

// currPerson - currentPerson - текущий человек, код внутри цикла будет вызываться раз за разом и в этой переменной последовательно окажутся все элементы последовательности, для каждого из которых можно будет что-то сделать

Console.WriteLine(currPerson.FioInitials);

}

Выйти из цикла можно с помощью ключевых слов break - просто прекращается выполнение цикла и continue - пропускает текущую итерацию и переходит к следующей

foreach (Person currPerson in personsList)

{

// пропускаем Пушкина и переходим к гончаровой

if (currPerson.Surname == "Пушкин")

{

continue;

}

Console.WriteLine(currPerson.FioInitials);

}

foreach (Person currPerson in personsList)

{

// цикл не сделает ничего, так как на первом шаге его выполнение прервется

if (currPerson.Surname == "Пушкин")

{

break;

}

Console.WriteLine(currPerson.FioInitials);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: