C# 4.0: полное руководство - Герберт Шилдт
Шрифт:
Интервал:
Закладка:
// нарушения безопасности обобщенного типа.
// lst.Add(99); // Ошибка, поскольку это не тип char!
}
}
Эта версия программы дает такой же результат, как и предыдущая.
Исходное количество элементов: 0
Добавить 6 элементов
Количество элементов: 6
Текущее содержимое: С А Е В D F
Удалить 2 элемента
Количество элементов: 4
Содержимое: С Е В D
Добавить еще 20 элементов
Текущая емкость: 32
Количество элементов после добавления 20 новых: 24
Содержимое: С Е В D a b c d e f g h i j k l m n o p q r s t
Изменить три первых элемента
Содержимое: X Y Z D a b c d e f g h i j k l m n o p q r s t
Класс LinkedList<T>В классе LinkedList<T> создается коллекция в виде обобщенного двунаправленного списка. В этом классе реализуются интерфейсы ICollection, ICollection<T>, IEnumerable, IEnumerable<T>, ISerializable и IDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. В классе LinkedList<T> определяются два приведенных ниже открытых конструктора.
public LinkedListO
public LinkedList(IEnumerable<T> collection)
В первом конструкторе создается пустой связный список, а во втором конструкторе — список, инициализируемый элементами из коллекции collection.
Как и в большинстве других реализаций связных списков, в классе LinkedList<T> инкапсулируются значения, хранящиеся в узлах списка, где находятся также ссылки на предыдущие и последующие элементы списка. Эти узлы представляют собой объекты класса LinkedListNode<T>. В классе LinkedListNode<T> предоставляются четыре следующих свойства.
public LinkedListNode<T> Next { get; }
public LinkedListNode<T> Previous { get; }
public LinkedList<T> List { get; }
public T Value { get; set; }
С помощью свойств Next и Previous получаются ссылки на предыдущий и последующий узлы списка соответственно, что дает возможность обходить список в обоих направлениях. Если же предыдущий или последующий узел отсутствует, то возвращается пустая ссылка. Для получения ссылки на сам список служит свойство List. А с помощью свойства Value можно устанавливать и получать значение, находящееся в узле списка.
В классе LinkedList<T> определяется немало методов. В табл. 25.16 приведены наиболее часто используемые методы данного класса. Кроме того, в классе LinkedList<T> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже.
public LinkedListNode<T> First { get; }
public LinkedListNode<T> Last { get; }
С помощью свойства First получается первый узел в списке, а с помощью свойства Last — последний узел в списке.
Таблица 25.16. Наиболее часто используемые методы, определенные в классе LinkedList<T>
Метод - Описание
public LinkedListNode<T> AddAfter(LinkedListNode<T> node, T value) - Добавляет в список узел со значением value непосредственно после указанного узла node. Указываемый узел node не должен быть пустым (null). Метод возвращает ссылку на узел, содержащий значение value
public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode) - Добавляет в список новый узел newNode непо
средственно после указанного узла node. Указываемый узел node не должен быть пустым (null). Если узел node отсутствует в списке или если новый узел newNode является частью другого списка, то* генерируется исключение InvalidOperationException
public LinkedListNode<T> AddBefore(LinkedListNode<T> node, T value) - Добавляет в список узел со значением value непо
средственно перед указанным узлом node. Указываемый узел node не должен быть пустым (null). Метод возвращает ссылку на узел, содержащий значение value
public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) - Добавляет в список новый узел newNode не
посредственно перед указанным узлом node. Указываемый узел node не должен быть пустым (null). Если узел node отсутствует в списке или если новый узел newNode является частью другого списка, то генерируется исключение InvalidOperationException
public LinkedList<T> AddFirst(T value) - Добавляет узел со значением value в начало списка. Метод возвращает ссылку на узел, содержащий значение value
public void AddFirst(LinkedListNode node) - Добавляет узел node в начало списка. Если узел node является частью другого списка, то генерируется исключение InvalidOperationException
public LinkedList<T> AddLast(T value) - Добавляет узел со значением value в конец списка. Метод возвращает ссылку на узел, содержащий значение value
public void AddLast(LinkedListNode node) - Добавляет узел node в конец списка. Если узел node является частью другого списка, то генерируется исключение InvalidOperationException
public LinkedList<T> Find(T value) - Возвращает ссылку на первый узел в списке, имеющий значение value. Если искомое значение value отсутствует в списке, то возвращается пустое значение
public LinkedList<T> FindLast(T value) - Возвращает ссылку на последний узел в списке, имеющий значение value. Если искомое значение value отсутствует в списке, то возвращается пустое значение
public bool Remove(T value) - Удаляет из списка первый узел, содержащий значение value. Возвращает логическое значение true, если узел удален, т.е. если узел со значением value обнаружен в списке и удален; в противном случае возвращает логическое значение false
public void Remove(LinkedList<T> node) - Удаляет из списка узел, соответствующий указанному узлу node. Если узел node отсутствует в списке, то генерируется исключение InvalidOperationException
public void RemoveFirst() - Удаляет из списка первый узел
public void RemoveLast() - Удаляет из списка последний узел
В приведенном ниже примере программы демонстрируется применение класса LinkedList<T>.
// Продемонстрировать применение класса LinkedList<T>.
using System;
using System.Collections.Generic;
class GenLinkedListDemo {
static void Main() {
// Создать связный список.
LinkedList<char> ll = new LinkedList<char>();
Console.WriteLine("Исходное количество элементов в списке: " + ll.Count);
Console.WriteLine();
Console.WriteLine("Добавить в список 5 элементов");
// Добавить элементы в связный список.
ll.AddFirst('А');
ll.AddFirst('В');
ll.AddFirst('С');
ll.AddFirst('D');
ll.AddFirst('Е');
Console.WriteLine("Количество элементов в списке: " + ll.Count);
// Отобразить связный список, обойдя его вручную.
LinkedListNode<char> node;
Console.Write("Отобразить содержимое списка по ссылкам: ");
for(node = ll.First; node != null; node = node.Next)
Console.Write(node.Value + " ");
Console.WriteLine("n") ;
// Отобразить связный список, обойдя его в цикле foreach.
Console.Write("Отобразить содержимое списка в цикле foreach: ");
foreach(char ch in ll)
Console.Write(ch + " ");
Console.WriteLine("n");
// Отобразить связный список, обойдя его
// вручную в обратном направлении.
Console.Write("Следовать по ссылкам в обратном направлении: ");