Чтение онлайн

на главную

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

Рис. 12.2. Печать массивов. Результаты работы процедуры PrintAr

Приведу некоторые комментарии.

Первое, на что следует обратить внимание: формальный аргумент процедуры принадлежит базовому классу Array, наследниками которого являются все массивы в CLR и, естественно, все массивы С#.

Для того чтобы сохранить возможность работы с индексами, как в одномерном, так и в двумерном случае, пришлось

организовать разбор случаев. Свойство Rank, возвращающее размерность массива, используется в этом разборе.

К элементам массива а, имеющего класс Array, нет возможности прямого доступа в обычной манере — A [<индексы>], но зато есть специальные методы GetValue (<индексы>) и SetValue (<индексы>).

Естественно, разбор случаев можно продолжить, придав процедуре большую функциональность.

Заметьте, если разбор случаев вообще не делать, а использовать PrintAr только для печати одномерных массивов, то она будет столь же проста, как и процедура PrintAr1, но сможет печатать любые одномерные массивы, независимо от типа их элементов.

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

В ряде задач массивы C# целесообразно рассматривать как коллекции, не используя систему индексов для поиска элементов. Это, например, задачи, требующие однократного или многократного прохода по всему массиву — нахождение суммы элементов, нахождение максимального элемента, печать элементов. В таких задачах вместо циклов типа For по каждому измерению достаточно рассмотреть единый цикл For Each по всей коллекции. Эта возможность обеспечивается тем, что класс Array наследует интерфейс IEnumerable. Обратите внимание, этот интерфейс обеспечивает только возможность чтения элементов коллекции (массива), не допуская их изменения. Применим эту стратегию и построим еще одну версию процедуры печати. Эта версия будет самой короткой и самой универсальной, поскольку подходит для печати массива, независимо от его размерности и типа элементов. Вот ее код:

public static void PrintCollection(string name,Array A)

{

Console.WriteLine(name);

foreach (object item in A)

Console.Write("\t {0}", item);

Console.WriteLine;

}//PrintCollection

Конечно, за все нужно платить. Платой за универсальность процедуры печати является то, что многомерный массив печатается как одномерный без разделения элементов на строки.

К сожалению, ситуация с чтением и записью элементов массива не симметрична. Приведу вариант процедуры CreateCollection;

public static void CreateCollection(Array A)

{

int i=0;

foreach (object item in A)

//item = rnd.Next(1,10); //item read only

A.SetValue(rnd.Next(1,10), i++);

}//CreateCollection

Заметьте,

эту процедуру сделать универсальной не удается, поскольку невозможно модифицировать элементы коллекции. Поэтому цикл For Each здесь ничего не дает, и разумнее использовать обычный цикл. Данная процедура не универсальна и позволяет создавать элементы только для одномерных массивов.

Сортировка и поиск. Статические методы класса Array

Статические методы класса Array позволяют решать самые разнообразные задачи:

1. Сору — позволяет копировать весь массив или его часть в другой массив.

2. IndexOf, Last IndexOf — определяют индексы первого и последнего вхождения образца в массив, возвращая -1, если такового вхождения не обнаружено.

3. Reverse — выполняет обращение массива, переставляя элементы в обратном порядке.

4. Sort — осуществляет сортировку массива.

5. Binary Search — определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска.

Все методы перегружены и имеют ряд модификаций. Большинство из этих методов применимо только к одномерным массивам. Приведу примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:

public void TestCollection

{

//операции над массивами

int nc = 7;

int[] col1 = new int[nc], col2 = new

int[nc]; doublet] col3 = new double[nc];

int[,] col4 = new int [2,2];

Arrs.CreateCollection(col1);

Arrs.PrintCollection("col1", col1);

Arrs.CreateCollection(col2);

Arrs.PrintCollection("соl2",соl2);

Arrs.CreateCollection (col3);

Arrs.PrintCollection("соl3",соl3);

Arrs.CreateTwoDimAr (col4);

Arrs.PrintCollection("соl4",соl4);

// сортировка, поиск, копирование

// поиск элемента

int first = Array.IndexOf(coll, 2);

int last = Array.LastlndexOf(col1,2);

if (first == -1)

Console.WriteLine("Нет вхождений 2 в массив col1");

else if (first ==last)

Console.WriteLine("Одно вхождение 2 в массив col1");

else

Console.WriteLine("Несколько вхождений 2 в массив col1");

//first = Array.IndexOf(col4, 4);

// только одномерный массив

Array.Reverse(col1);

Console.WriteLine("Обращение массива col1: ");

Arrs.PrintCollection("col1",col1);

// Копирование

Array.Copy(col1, col3, col1.Length);

Console.WriteLine(" Массив col3 после копирования массива col1: ");

Arrs. PrintCollection ("col3", col3);

Array.Copy(col1,1,соl2,1,2);

Console.WriteLine("копирование двух элементов col1 в col2:");

Arrs.PrintCollection("col1", col1);

Arrs.PrintCollection("col2",col2);

// быстрая сортировка Хоара Array.Sort(col1);

Поделиться:
Популярные книги

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

Буревестник. Трилогия

Сейтимбетов Самат Айдосович
Фантастика:
боевая фантастика
5.00
рейтинг книги
Буревестник. Трилогия

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Приватная жизнь профессора механики

Гулиа Нурбей Владимирович
Проза:
современная проза
5.00
рейтинг книги
Приватная жизнь профессора механики

Башня Ласточки

Сапковский Анджей
6. Ведьмак
Фантастика:
фэнтези
9.47
рейтинг книги
Башня Ласточки

Два мира. Том 1

Lutea
Фантастика:
фэнтези
попаданцы
мистика
5.00
рейтинг книги
Два мира. Том 1

Отрок (XXI-XII)

Красницкий Евгений Сергеевич
Фантастика:
альтернативная история
8.50
рейтинг книги
Отрок (XXI-XII)

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать