KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Герберт Шилдт, "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("Следовать по ссылкам в обратном направлении: ");

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*