Лекция 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();
}