Страница 462 из 502
<b> lst.Remove('А');</b>
<b> Console.WriteLine("Количество элементов: " + lst.Count);</b>
<b> // Отобразить содержимое динамического массива, используя цикл foreach.</b>
<b> Console.Write("Содержимое: ");</b>
<b> foreach(char с in lst)</b>
<b> Console.Write(с + " ");</b>
<b> Console.WriteLine("n");</b>
<b> Console.WriteLine("Добавить еще 20 элементов");</b>
<b> // Добавить количество элементов, достаточное для</b>
<b> // принудительного расширения массива,</b>
<b> for(int i=0; i < 20; i++)</b>
<b> lst.Add((char) ('a' + i));</b>
<b> Console.WriteLine("Текущая емкость: " + lst.Capacity);</b>
<b> Console.WriteLine("Количество элементов после добавления 20 новых: " + lst.Count);</b>
<b> Console.Write("Содержимое: ");</b>
<b> foreach(char с in lst)</b>
<b> Console.Write(с + " ") ;</b>
<b> Console.WriteLine("n");</b>
<b> // Изменить содержимое динамического массива,</b>
<b> // используя индексирование массива.</b>
<b> Console.WriteLine("Изменить три первых элемента");</b>
<b> lst[0] = 'X';</b>
<b> lst[1] = 'Y' ;</b>
<b> lst[2] = 'Z';</b>
<b> Console.Write("Содержимое: ");</b>
<b> foreach(char с in lst)</b>
<b> Console.Write(с + " ");</b>
<b> Console.WriteLine();</b>
<b> // Следующая строка кода недопустима из-за</b>
<b> // нарушения безопасности обобщенного типа.</b>
<b> // lst.Add(99); // Ошибка, поскольку это не тип char!</b>
<b> }</b>
<b>}</b>
Эта версия программы дает такой же результат, как и предыдущая.
<b>Исходное количество элементов: 0</b>
<b>Добавить 6 элементов</b>
<b>Количество элементов: 6</b>
<b>Текущее содержимое: С А Е В D F</b>
<b>Удалить 2 элемента</b>
<b>Количество элементов: 4</b>
<b>Содержимое: С Е В D</b>
<b>Добавить еще 20 элементов</b>
<b>Текущая емкость: 32</b>
<b>Количество элементов после добавления 20 новых: 24</b>
<b>Содержимое: С Е В D a b c d e f g h i j k l m n o p q r s t</b>
<b>Изменить три первых элемента</b>
<b>Содержимое: X Y Z D a b c d e f g h i j k l m n o p q r s t</b>
В классе LinkedList<T> создается коллекция в виде обобщенного двунаправленного списка. В этом классе реализуются интерфейсы ICollection, ICollection<T>, IEnumerable, IEnumerable<T>, ISerializable и IDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. В классе LinkedList<T> определяются два приведенных ниже открытых конструктора.
<b>public LinkedListO</b>
<b>public LinkedList(IEnumerable<T> collection)</b>
В первом конструкторе создается пустой связный список, а во втором конструкторе — список, инициализируемый элементами из коллекции collection.
Как и в большинстве других реализаций связных списков, в классе LinkedList<T> инкапсулируются значения, хранящиеся в узлах списка, где находятся также ссылки на предыдущие и последующие элементы списка. Эти узлы представляют собой объекты класса LinkedListNode<T>. В классе LinkedListNode<T> предоставляются четыре следующих свойства.
<b>public LinkedListNode<T> Next { get; }</b>
<b>public LinkedListNode<T> Previous { get; }</b>
<b>public LinkedList<T> List { get; }</b>
<b>public T Value { get; set; }</b>
С помощью свойств Next и Previous получаются ссылки на предыдущий и последующий узлы списка соответственно, что дает возможность обходить список в обоих направлениях. Если же предыдущий или последующий узел отсутствует, то возвращается пустая ссылка. Для получения ссылки на сам список служит свойство List. А с помощью свойства Value можно устанавливать и получать значение, находящееся в узле списка.