Коллекция в языке C# — это объединение произвольного количества объектов, возможно, объектов разного типа.
Коллекция — это динамическая структура данных. Массивы в C# также являются динамическими, но после того, как память под массив выделена, мы не можем изменить его размер. Работа с коллекцией ведётся по-другому. Память под коллекцию не фиксируется, данные могут добавляться или удаляться по мере необходимости. Кроме того, для многих видов коллекций возможно включение в коллекцию данных разного типа.
Как видим, коллекция — это более гибкая организация данных, чем обычный массив. Но работа с массивом всегда ведётся быстрее, чем с коллекцией.
Для работы с коллекциями используется область имён System.Collections. Наиболее популярными видами коллекций являются:
ArrayList — представляет из себя упорядоченную коллекцию объектов, доступ к которым можно получить, используя индекс, т.е. это аналог массива.
Hashtable — в отличие от коллекции ArrayList, индексирующей элементы в числовой форме, Hashtable индексирует элементы с помощью имён.
SortedList — представляет из себя нечто среднее между ArrayList и Hashtable, обладая двумя сортируемыми массивами: ключей и значений.
BitArray — представляет из себя вариант коллекции ArrayList для хранения значений битов.
Queue — реализует структуру, называемую очередью. В этой структуре к элементам осуществляется доступ по принципу «первый пришел, первый ушел».
Stack — реализует структуру, называемую стеком, В этой структуре к элементам осуществляется доступ по принципу «первый пришел, последним ушел».
Рассмотрим каждую из коллекций более подробно.
Коллекция 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, описывающий работу со студентами. Пусть у него будут поля:
fio — фамилия студента;
ochenka — средняя оценка.
В тестирующей программе создадим массив типа 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 . . .
|
|
|
|