русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2013-12-23; просмотров: 1335; Нарушение авторских прав


Статические методы класса Array

Свойства класса Array

Базовый класс System.Array

Нельзя понять многие детали работы с массивами в C#, если не знать устройство класса Array из библиотеки FCL(статическом компоненте Framework .Net.), потомками которого являются все классы-массивы. Помимо наследования свойств и методов класса Object и вышеперечисленных интерфейсов, класс Array имеет довольно большое число собственных методов и свойств. Благодаря такому мощному родителю, над массивами определены самые разнообразные операции - копирование, поиск, обращение, сортировка, получение различных характеристик. Массивы можно рассматривать как коллекции и устраивать циклы For Each для перебора всех элементов.

 

Свойство Родитель Описание
IsFixedSize Интерфейс IList True, если массив статический
Length   Число элементов массива
Rank   Размерность массива

 

Метод Описание
BinarySearch() Двоичный поиск.
Clear() Выполняет начальную инициализацию элементов. В зависимости от типа элементов устанавливает значение 0 для арифметического типа, false - для логического типа, Null для ссылок, "" - для строк.
Copy() Копирование части или всего массива в другой массив.
IndexOf() Индекс первого вхождения образца в массив.
LastIndexOf() Индекс последнего вхождения образца в массив.
Reverse() Обращение одномерного массива.
Sort() Сортировка одномерного массива встроенных типов данных.
  Динамические методы
GetValue() SetValue() Возвращает или устанавливает значение указанного индекса для массива.
GetLowerBound() GetUpperBound() Используется для определения нижней или верхней границы выбранного измерения массива.
Clone Интерфейс ICloneable Позволяет создать плоскую или глубокую копию массива. В первом случае создаются только элементы первого уровня, а ссылки указывают на те же самые объекты. Во втором случае копируются объекты на всех уровнях. Для массивов создается только плоская копия.
CopyTo Интерфейс ICollection Копируются все элементы одномерного массива в другой одномерный массив, начиная с заданного индекса: col1.CopyTo(col2,0);
GetEnumerator Интерфейс IEnumerable Стоит за спиной цикла ForEach
GetLength   Возвращает число элементов массива по указанному измерению. Описание и примеры даны в тексте главы.
       

 



Class Arrays {

Public ststic int Main(string[] args) {

//Массивы символьных строк

string[] firstNames = new string[5];

{ “Саша”, “Маша”, “Олег”, “Света”, “Игорь”}

//выводим элементы массива

Console.WriteLine(“Here is the array:”);

for(int i=0; i< firstNames.Length; i++)

Console.WriteLine(firstNames[i]+”\t”);

//расставляем в обратном порядке

Array.Reverse(firstNames);

for(int i=0; i< firstNames.Length; i++)

Console.WriteLine(firstNames[i]+”\t”);

 

//теперь вычищаем всех кроме Игоря

Console.WriteLine(“Cleared out all but one…”);

Array.Clear(firstNames,1,4);

for(int i=0; i< firstNames.Length; i++)

Console.WriteLine(firstNames[i]+”\t\n”);

return 0;

}}

Приведу общую процедуру, формальный аргумент которой будет принадлежать родителю всех классов-массивов, что позволит передавать массив любого класса в качестве фактического аргумента:

public static void PrintAr(string name, Array A) {

Console.WriteLine(name);

switch (A.Rank) {

case 1:

for(int i = 0; i<A.GetLength(0);i++)

Console.Write("\t" + name + "[{0}]={1}", i, A.GetValue(i));

Console.WriteLine();

break;

case 2:

for(int i = 0; i<A.GetLength(0);i++) {

for(int j = 0; j<A.GetLength(1);j++)

Console.Write("\t" + name + "[{0},{1}]={2}",

i,j, A.GetValue(i,j));

Console.WriteLine();

}

break;

default: break;

}

}//PrintAr

Вот как выглядит создание массивов и вызов процедуры печати:

 

public void TestCommonPrint(){

//Класс Array

int[] ar1 = new int[5];

double[] ar2 ={5.5, 6.6, 7.7};

int[,] ar3 = new Int32[3,4];

Arrs.CreateOneDimAr(ar1);Arrs.PrintAr("ar1", ar1);

Arrs.PrintAr("ar2", ar2);

Arrs.CreateTwoDimAr(ar3);Arrs.PrintAr("ar3", ar3);

}//TestCommonPrint

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

Для того чтобы сохранить возможность работы с индексами, как в одномерном, так и в двумерном случае, пришлось организовать разбор случаев. Свойство Rank, возвращающее размерность массива, используется в этом разборе.

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

В ряде задач массивы C# целесообразно рассматривать как коллекции, не используя систему индексов для поиска элементов. Это, например, задачи, требующие однократного или многократного прохода по всему массиву - нахождение суммы элементов, нахождение максимального элемента, печать элементов. В таких задачах вместо циклов типа For по каждому измерению достаточно рассмотреть единый цикл Foreach по всей коллекции. Эта возможность обеспечивается тем, что класс 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

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

Приведу примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:

 

public void TestCollection() {

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

int nc = 7;

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

double[] col3 = new double[nc];

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

Arrs.CreateCollection(col1);

Arrs.PrintCollection("col1",col1);

Arrs.CreateCollection(col2);

Arrs.PrintCollection("col2",col2);

Arrs.CreateCollection(col3);

Arrs.PrintCollection("col3",col3);

Arrs.CreateTwoDimAr(col4);

Arrs.PrintCollection("col4",col4);

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

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

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

int last = Array.LastIndexOf(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,col2,1,2);

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

Arrs.PrintCollection("col1",col1);

Arrs.PrintCollection("col2",col2);

//быстрая сортировка Хоара

Array.Sort(col1);

Console.WriteLine("Отсортированный массив col1:");

Arrs.PrintCollection("col1",col1);

first = Array.BinarySearch(col1, 2);

Console.WriteLine("Индекс вхождения 2 в col1: {0}",first);

//Создание экземпляра (массива)

Array my2Dar = Array.CreateInstance(typeof(double), 2,3);

Arrs.PrintCollection("my2Dar",my2Dar);

//клонирование

my2Dar = (Array)col4.Clone();

Console.WriteLine("Массив my2Dar после клонирования

col4:");

Arrs.PrintCollection("my2Dar",my2Dar);

//копирование CopyTo

col1.CopyTo(col2,0);

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

Arrs.PrintCollection("col2",col2);

}

В этой процедуре продемонстрированы вызовы различных статических методов класса Array. Для метода Copy показан вызов двух реализаций этого метода, когда копируется весь массив и часть массива. Закомментированный оператор вызова метода IndexOf напоминает о невозможности использования методов поиска при работе с многомерными массивами.

 



<== предыдущая лекция | следующая лекция ==>
Форматированный вывод | Операции над строками


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.006 сек.