
- •Доступ к элементам массива
- •Многомерные массивы
- •Зубчатые массивы
- •Класс Array
- •Создание массивов
- •Копирование массивов
- •Сортировка
- •Массивы в качестве параметров
- •Ковариантость массивов
- •Перечисления
- •Интерфейс iEnumerator
- •Оператор foreach
- •Оператор yield
- •Различные способы итерации по содержимому коллекций
- •Возврат перечислителей посредством yield return
- •Кортежи
- •Структурное сравнение
- •If (t1.Equals(t2)) Console.WriteLine("одинаковое содержимое");
Массивы в качестве параметров
Массивы могут передаваться в методы в качестве параметров, а также возвращаться из методов. Для возврата массива достаточно объявить массив как тип возврата, как показано в следующем методе GetPersons():
static Person[] GetPersons()
{
return new Person [ ] {
new Person { FirstName="Damon", LastName="Hill" },
new Person { FirstName="Niki", LastName="Lauda" },
new Person { FirstName="Ayrton", LastName="Senna" },
new Person { FirstName="Graham", LastName="Hill" }
};
}
Для передачи массивов в метод массив объявляется в параметре, как показано в следующем методе DisplayPersons():
static void DisplayPersons(Person[] persons)
{
//...
Ковариантость массивов
Для массивов поддерживается ковариантность. Это значит, что массив может быть объявлен как базовый тип, и его элементам могут присваиваться элементы производных типов. Например, можно объявить параметр типа object[] и передать в нем Person[]:
static void DisplayArray(object[] data) .
{
//...
}
Ковариантность массивов возможна только, для ссылочных типов, но не для типов значений.
С ковариантностью массивов связана проблема, которая может быть решена только через исключения времени выполнения. Если присвоить массив Person массиву object, mo массив object затем может быть использован со всем, что наследуется от object. Например, компилятор разрешит передавать строки в элементах такого массива. Однако, поскольку на самом деле ссылка на массив Person производится через массив object, возникает исключение времени выполнения.
Структура ArraySegment<T>
Структура ArraySegment<T> представляет сегмент массива. Это структура может применяться, когда нужно вернуть или передать методу части массива. Вместо передачи в метод массива, смещения и счетчика в отдельных параметрах, можно передать единственный параметр ArraySegment<T>. В этой структуре информация о сегменте (смещение и счетчик) заключена непосредственно в ее членах.
Метод SumOfSegments принимает массив элементов ArraySegment<int> для вычисления суммы всех целых чисел, определенных в сегменте, и возвращает эту сумму:
static int SumOfSegments(ArraySegment<int>[] segments)
{
int sum =0;
foreach (var segment in segments)
{
for (int i=segment.Offset; i<segment.Offset+segment.Count; i++)
{
sum += segment.Array[i];
}
}
return sum;
}
Этот метод используется посредством передачи массива сегментов. Первый элемент массива ссылается на три элемента ar1, начиная с первого, а второй элемент на три элемента аr2, начиная с четвертого:
int[] ar1 = { 1, 4, 5, 11, 13, 18 };
int[] ar2 = { 3, 4, 5, 18, 21, 27, 33 };
var segments = new ArraySegment<int>[2]
{
new ArraySegment<int>(ar1, 0, 3),
new ArraySegment<int>(ar2, 3, 3)
} ;
var sum = SumOfSegments(segments);
Важно отметить, что сегменты массива не копируют элементы исходного массива. Вместо этого через ArraySegment<T> можно получить доступ к исходному массиву Если изменяются элементы сегмента, то эти изменения будут видны в исходном массиве.