Коллекции

Коллекция в языке C# — это объединение произвольного количества объектов, возможно, объектов разного типа.

Коллекция — это динамическая структура данных. Массивы в C# также являются динамическими, но после того, как память под массив выделена, мы не можем изменить его размер. Работа с коллекцией ведётся по-другому. Память под коллекцию не фиксируется, данные могут добавляться или удаляться по мере необходимости. Кроме того, для многих видов коллекций возможно включение в коллекцию данных разного типа.

Как видим, коллекция — это более гибкая организация данных, чем обычный массив. Но работа с массивом всегда ведётся быстрее, чем с коллекцией.

Для работы с коллекциями используется область имён System.Collections. Наиболее популярными видами коллекций являются:

ArrayList — представляет из себя упорядоченную коллекцию объектов, доступ к которым можно получить, используя индекс, т.е. это аналог массива.

Hashtable — в отличие от коллекции ArrayList, индексирующей элементы в числовой форме, Hashtable индексирует элементы с помощью имён.

SortedList — представляет из себя нечто среднее между ArrayList и Hashtable, обладая двумя сортируемыми массивами: ключей и значений.

BitArray — представляет из себя вариант коллекции ArrayList для хранения значений битов.

Queue — реализует структуру, называемую очередью. В этой структуре к элементам осуществляется доступ по принципу «первый пришел, первый ушел».

Stack — реализует структуру, называемую стеком, В этой структуре к элементам осуществляется доступ по принципу «первый пришел, последним ушел».

Рассмотрим каждую из коллекций более подробно.

ArrayList

Коллекция ArrayList моделирует поведение массива. Рассмотрим основные приёмы работы с этой коллекцией.

1.Создание объекта класса ArrayList

Создания объекта класса ArrayList выполняется практически так же, как создаётся объект любого другого класса. Рассмотрим основные варианты создания объектов класса ArrayList:

а)создаём объект x типа ArrayList, который не содержит ни одного элемента:

ArrayList x = new ArrayList();

Это наиболее распространённый метод создания объекта типа ArrayList. В этом случае объект имеет по-умолчанию ёмкость 16 элементов, т.е. память не будет выделяться дополнительно до тех пор, пока в объекте находится не более 16 элементов.

б)создаём объект x типа ArrayList, который рассчитан на хранение заданного количества элементов (n):

int n = 20;

ArrayList x = new ArrayList(n);

Здесь под массив будет выделено памяти не менее, чем под n элементов.

в)создаём объект x1 типа ArrayList на базе ранее созданного объекта x типа ArrayList:

ArrayList x1 = new ArrayList(x);

Здесь массив x1 будет точной копией массива x.

2.Добавление новых элементов в массив в конец массива

Для добавление новых элементов в массив типа ArrayList имеется два метода. В обоих случаях добавление всегда делается в конец данного массива:

а)Для добавления новых элементов в массив типа ArrayList по одному используется метод Add():

x.Add(12.5);

Здесь в конец массива x добавляется число 12.5. К стати, метод Add() возвращает значение целого типа, являющееся номером добавляемого элемента. На практике этот номер обычно не используется.

б)Добавление в конец массива ранее созданного массива:

x1.AddRange(x);

Теперь в массиве x1 содержатся не только его прежние элементы, но и новые, скопированные из массива x. Сам же массив x остаётся без изменения.

3.Удаление данных из массива

Для удаления данных также имеется несколько вариантов:

а)Удаление всех элементов массива (очистка массива):

x.Clear();

После выполнения такого оператора массив x типа ArrayList станет пустым. Сам объект x не удаляется!

б)Удаление заданного элемента массива (надо указать значение того, что ищем, и, если элемент с таким значением будет найдет, то он удалится):

x.Remove("tetta");

в)Удаление одного элемента, заданного своим номером:

int i = 1;

x1.RemoveAt(i);

г)Удаление нескольких подряд идущих элементов:

int i = 2, k = 3;

x.RemoveRange(i, k);

Здесь из массива x, начиная с позиции i (2), будут удалены k (3) элементов.

4.Определение размера массива

Имеется два удобных свойства:

а) Count — определяет текущее количество элементов в массиве. Пример типичного использования этого свойства (в цикле выводим элементы массива на печать):

for(int i = 0; i < x.Count; i++)

{

   Console.WriteLine(x[i]);

}

б) Capacity — хранит ёмкость объекта типа ArrayList, т.е. максимальное количество элементов, которое может храниться в объекте без дополнительного выделения памяти.

5.Сортировка массива

Во многих случаях бывает удобным работать с упорядоченным массивом данных. Для этого используется метод Sort():

а)упорядочение всего массива:

x.Sort();

б)упорядочение данного количества элементов массива, начиная с заданного элемента:

x.Sort(1, 2, null);

Здесь мы упорядочиваем 2 элемента массив, начиная с 1-го (индексы начинаются с 0). Третий параметр, имеющий значение null, означает, что у нас используется стандартный компаратор (объект, производящий сравнение). Если сортируется массив, состоящий из объектов стандартных типов (как в нашем случае), то компаратор не требуется перегружать. Если сортировать массив, состоящий из объектов класса (например, Student), созданного пользователем, то требуется реализовать в этом классе (Student) интерфейсы Icomparable и IComparer, а ссылку на реализованный интерфейс IComparer должна быть передана методу Sort() в качестве третьего параметра.

в)упорядочение всего массива, состоящего из объектов класса пользователя:

x.Sort(t);

где t — ссылка на реализованный интерфейс IComparer (см. выше). Пример сортировки массива объектов пользователя рассмотрен ниже в п. 7.

6.Расположение элементов массива в обратном порядке

Используется метод Reverse(), имеющий две реализации:

а)Применить метод для всего массива:

x.Reverse();

б)Записать требуемое количество элементов (у нас их 3) в обратном порядке, начиная заданной позиции (у нас это 2):

x.Reverse(2,3);

Замечание. Метод Sort() упорядочивает массив по возрастанию. Если после вызова метода Sort() применить ещё и Reverse(), то получим массив, упорядоченный по убыванию.

7.Сортировка массива типа ArrayList, состоящего из элементов класса пользователя

Создадим класс Student, описывающий работу со студентами. Пусть у него будут поля:

В тестирующей программе создадим массив типа ArrayList, а затем упорядочим этот массив. Упорядочение делаем по фамилиям в алфавитном порядке, в случае одинаковых фамилий — по возрастанию средних оценок.

Вот текст программы:

using System;

using System.Collections;

namespace Prim_ArraySort_my_Sort

{

   public class Student: IComparable, IComparer

   {

      private string fio;

      private double ochenka;

      public Student()

      {

         fio = "NoName";

         ochenka = 0;

      }

      public Student(string f, double o)

      {

         fio = f;

         ochenka = o;

      }

      public void print()

      {

         Console.WriteLine("FIO = {0}  средняя оценка = {1}", fio, ochenka);

      }

      // Реализация метода Compare() интерфейса IComparer

      public int Compare(Object x0, Object y0)

      {

         Student x =(Student) x0;

         Student y =(Student) y0;

         if(String.Compare(x.fio, y.fio) < 0)

         {

            return -1;

         }

         else if(String.Compare(x.fio, y.fio) == 0)

         {

            if(x.ochenka < y.ochenka)

               return -1;

            else if(x.ochenka == y.ochenka)

               return 0;

            else

               return 1;

         }

         else

            return 1;

      }

      // Реализация метода CompareTo() интерфейса IComparable

      public int CompareTo(Object x)

      {

         return Compare(this, x);

      }

   }

   class Program

   {

      public static void Main(string[] args)

      {

         Console.WriteLine("Тестирование класса Student");

         Console.WriteLine("\nСписок студентов до сортировки:");

         ArrayList x = new ArrayList();

         x.Add(new Student("Иванов",3.5));

         x.Add(new Student("Петров",4.2));

         x.Add(new Student("Борисов",4.5));

         x.Add(new Student("Сергеев",4.8));

         x.Add(new Student("Борисов",3.0));

         Student st = new Student();

         for(int i = 0; i < x.Count; i++)

         {

            st = (Student) x[i];

            st.print();

         }

         //Создаём ссылку Comp типа IComparer на объект типа Student

         IComparer Comp = new Student();

         // Передаём ссылку Comp типа IComparer в метод сортировки

         x.Sort(Comp);

         Console.WriteLine("\nСписок студентов после сортировки:");

         for(int i = 0; i < x.Count; i++)

         {

            st = (Student) x[i];

            st.print();

         }

         Console.Write("Press any key to continue . . . ");

         Console.ReadKey(true);

      }

   }

}

Результаты расчёта:

Тестирование класса Student


Список студентов до сортировки:

FIO = Иванов  средняя оценка = 3,5

FIO = Петров  средняя оценка = 4,2

FIO = Борисов  средняя оценка = 4,5

FIO = Сергеев  средняя оценка = 4,8

FIO = Борисов  средняя оценка = 3


Список студентов после сортировки:

FIO = Борисов  средняя оценка = 3

FIO = Борисов  средняя оценка = 4,5

FIO = Иванов  средняя оценка = 3,5

FIO = Петров  средняя оценка = 4,2

FIO = Сергеев  средняя оценка = 4,8

Press any key to continue . . .


Назад
На верх
Вперёд
Hosted by uCoz