Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 22. Классы-прототипы. Параметризованные коллекции.doc
Скачиваний:
146
Добавлен:
24.02.2016
Размер:
72.19 Кб
Скачать

Лекция 22. Классы прототипы, параметризованные коллекции

Многие алгоритмы не зависят от типов данных, с которыми они работают. Например, такие алгоритмы как сортировка и поиск. Возможность отделить алгоритмы от типов данных предоставляют классы-прототипы, которые в литературе встречаются под названиями “шаблоны классов”, ” параметризованные классы”, ” обобщённые классы”.

Классы прототипы имеют параметр – тип данных и поэтому еще называются параметризованными классами. Чаще всего эти классы применяются для хранения данных, то есть в качестве контейнерных классовиликоллекций.

Существуют “стандартные” классы прототипы, которые называются параметризованными коллекциями. Такие коллекции – это уже готовые шаблоны для различных структур данных – стеков, очередей, списков, бинарных деревьев и т.д. Эти коллекции хранятся в пространстве имёнSystem.Collections.Generic.

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

В качестве примера рассмотрим параметризованную коллекцию List <T>,которая является двойником обычной коллекции (семейства) ArrayList.

Пример применения параметризованной коллекции List <T>

using System.Collections.Generic;

using MonsterLib; //описание классов Monster и Daemon смотри в предыдущих //лекциях – данные классы включены в библиотеку MonsterLib

static void Main(string[] args)

{

//объявление экземпляра коллекции List с параметром – типом данных – классом Monster

List<Monster> mas = new List<Monster>();

//добавление в коллекцию объектов класса Moster и производного от него Daemon

mas.Add(new Monster ("Вася"));

mas.Add(new Daemon("Демон", 3));

//вывод всех элементов в коллекции

foreach (Monster x in mas) x.passport();

//объявление экземпляра коллекции List с параметром – типом данных – int

List<int> masl = new List<int>();

//добавление в коллекцию целых чисел

masl.Add(5);

masl.Add(1);

//применение метода Sort() коллекции List для целых чисел

masl.Sort();

//к элементам коллекции можно обратиться по индексу!

int a = masl[0];

Console.WriteLine(a);

//вывод всех элементов в коллекции

foreach(int x in masl) Console.WriteLine( x+ ” ”);

}

В предложенном примере реализовано две коллекции на основе параметризованной коллекции List<Т>. Первая коллекцияmasсодержит список (аналог одномерного массива) экземпляров (объектов) классов типаMonster. В данной коллекцииmasможно хранить элементы классаMonster, а также любого класса, производного отMonster. Другие типы данных в коллекцииmasнедопустимы.

Существуют параметризованные коллекции с несколькими параметрами, как например, коллекция Dictionary<T,K> - так называемый словарь. У данной коллекции два параметра – тип ключей и тип значений, хранимых в словаре.

В следующем примере демонстрируется применение параметризованной коллекции Dictionary<T,K>.

Пример применения параметризованной коллекции Dictionary <T,K>

В примере программы считывается содержимое текстового файла, считанный текст разбивается на слова и подсчитывается количество повторений каждого слова в тексте.

В качестве ключей в примере используются слова, считанные из файла, а значения представляют собой целочисленные счетчики, которые увеличиваются на единицу, когда слово встречается очередной раз.

using System.Collection.Generic;

using System.IO;

static void Main(string[] args)

{

//файл должен существовать!!!

StreamReader f = new StreamReader(@"d:\text.txt");

//считывание содержимого файла в одну строку

string s = f.ReadToEnd();

//массив всех символов-разделителей слов

char[] razdeliteli = { '.', ' ', ',', '!' };

//s.Split(raxdeliteli) – разделение строки на слова, используя разделители. Результат - массив строк(слов) slova

List<string> slova = new List<string>(s.Split(razdeliteli));

//mas – список с параметрами – слово и количество его вхождений, причем слова-это ключи, значения-счетчики вхождений

Dictionary<string, int> mas = new Dictionary<string, int>();

foreach (string w in slova)

{

//если в массиве по ключам(словам) слово встретилось впервые в //значение, соответствующее этому слову заносится 1, если слово //уже встречалось значение увеличивается на единицу

//mas[w]-количество повторений слова w

if (mas.ContainsKey(w)) mas[w]++; else mas[w] = 1;

}

//вывод всех слов в массиве mas по ключам

foreach (string w in mas.Keys)

Console.WriteLine("{0}\t{1}", w, mas[w]);

Console.ReadKey();

}