![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Типы для работы с коллекциями-списками
Рассмотрим типы из базовой библиотеки платформы.NET, применяемые при работе с коллекциями со списковой семантикой. Класс List< T> из пространства имён System.Collections.Generic – основной класс для представления наборов, которые допускают динамическое добавление элементов[7]. Для хранения данных набора используется внутренний массив. Класс List< T> реализует интерфейсы IList< T> и IList. В табл. 8 представлено описание public-элементов класса List< T>. Таблица 8 Элементы класса List< T>
Класс List< T> имеет три конструктора. Первый из них – обычный конструктор без параметров. Второй конструктор позволяет создать набор на основе коллекции – производится копирование элементов коллекции в список. Третий конструктор принимает в качестве аргумента начальную ёмкость набора. Ёмкость набора (capacity) – это количество элементов набора, которое он способен содержать без увеличения размера внутреннего массива. Следующий код демонстрирует использование некоторых свойств и методов класса List< T>. Обратите внимание, что для добавления элементов в созданный набор применяется возможность инициализации классов-коллекций. List< string> words = new List< string> {" melon", " avocado" }; words.AddRange(new[] {" banana", " plum" }); words.Insert(0, " lemon"); words.InsertRange(0, new[] {" peach", " apple" }); words.Remove(" melon"); words.RemoveAt(3); words.RemoveAll(s => s.StartsWith(" a")); List< string> subset = words.GetRange(1, 2); string[] wordsArray = words.ToArray(); List< int> lengths = words.ConvertAll< int> (s => s.Length); На примере List< T> рассмотрим особенность, присущую использованию коллекций в языке C#. Если коллекция хранит структуры, то C# не позволяет изменить части структуры при помощи индексатора коллекции (так как индексатор является функцией, возвращающей копию элемента коллекции): public struct Student { public string Name { get; set; } }
var list = new List< Student> {new Student {Name = " Ivanov" }}; list[0].Name = " Petrov"; // ошибка компиляции! Класс LinkedList< T> служит для представления двусвязного списка. Такой список позволяет осуществлять вставку и удаление элемента без сдвига остальных элементов. Однако доступ к элементу по индексу требует прохода по списку. LinkedList< T> реализует интерфейсы ICollection и ICollection< T>. Каждый элемент двусвязного списка представлен объектом LinkedListNode< T>. public sealed class LinkedListNode< T> { public LinkedList< T> List { get; } public LinkedListNode< T> Next { get; } public LinkedListNode< T> Previous { get; } public T Value { get; set; } } При добавлении элемента можно указать, чтобы он помещался в начало списка, или в конец списка, или относительно существующего в списке элемента. Для этого класс LinkedList< T> содержит специальные методы: public void AddFirst(LinkedListNode< T> node); public LinkedListNode< T> AddFirst(T value);
public void AddLast(LinkedListNode< T> node); public LinkedListNode< T> AddLast(T value);
public void AddAfter(LinkedListNode< T> node, LinkedListNode< T> newNode); public LinkedListNode< T> AddAfter(LinkedListNode< T> node, T value);
public void AddBefore(LinkedListNode< T> node, LinkedListNode< T> newNode); public LinkedListNode< T> AddBefore(LinkedListNode< T> node, T value); Аналогичные методы существуют и для удаления элементов списка: public void RemoveFirst(); public void RemoveLast(); public bool Remove(T value); public void Remove(LinkedListNode< T> node); Класс LinkedList< T> содержит свойства для числа элементов, для указания на первый и последний элемент. Имеются методы для поиска элементов. Ниже приведён пример использования LinkedList< T>. var tune = new LinkedList< string> (); tune.AddFirst(" do"); // do tune.AddLast(" so"); // do - so tune.AddAfter(tune.First, " re"); // do - re- so tune.AddAfter(tune.First.Next, " mi"); // do - re - mi- so tune.AddBefore(tune.Last, " fa"); // do - re - mi - fa- so tune.RemoveFirst(); // re - mi - fa - so tune.RemoveLast(); // re - mi - fa var miNode = tune.Find(" mi"); tune.Remove(miNode); // re - fa tune.AddFirst(miNode); // mi - re - fa Классы Queue< T> и Stack< T> реализуют структуры данных «очередь» и «стек» на основе массива[8]. Конструкторы этих классов, как и конструкторы класса List< T>, позволяют создать объект на основе другой коллекции, а также указать значение для ёмкости (но ёмкость не доступна в виде отдельного свойства). Элементы классов вполне предсказуемы и описаны в табл. 9 и табл. 10. Таблица 9 Элементы класса Queue< T>
Таблица 10 Элементы класса Stack< T>
|