class GenListDemo { static void Main() {
// Создать коллекцию в виде динамического массива.
List<char> 1st = new List<char>();
Console.WriteLine("Исходное количество элементов: " + lst.Count);
Console.WriteLine();
Console.WriteLine("Добавить 6 элементов");
// Добавить элементы в динамический массив.
1st.Add('С');
1st.Add(1А *);
1st.Add('Е');
1st.Add(1В1);
1st.Add('D');
1st.Add('F');
Console.WriteLine("Количество элементов: " + lst.Count);
// Отобразить содержимое динамического массива,
// используя индексирование массива.
Console.Write("Текущее содержимое: "); for (int i=0; i < lst.Count;. i++)
Console.Write(1st[i] + " ");
Console.WriteLine("\n");
Console.WriteLine("Удалить 2 элемента ");
// Удалить элементы из динамического массива.
1st.Remove('F');
1st.Remove('А1);
Console.WriteLine("Количество элементов: " + lst.Count);
// Отобразить содержимое динамического массива, используя цикл foreach. Console.Write("Содержимое: "); foreach(char с in 1st)
Console.Write(с + " ");
Console.WriteLine("\n");
Console.WriteLine("Добавить еще 20 элементов");
// Добавить количество элементов, достаточное для // принудительного расширения массива, for(int i=0; i < 20; i++)
1st.Add((char) ('a1 + i));
Console.WriteLine("Текущая емкость: " + 1st.Capacity);
Console.WriteLine("Количество элементов после добавления 20 новых: " + 1st.Count);
Console.Write("Содержимое: ");
Foreach(char с in 1st)
Console.Write(с + " ");
Console.WriteLine("\n");
// Изменить содержимое динамического массива,
//’ используя индексирование массива.
Console.WriteLine("Изменить три первых элемента"); 1st [0] = 1X'; lst[l] = ' Y';
1st[2] = 1Z1;
Console.Write("Содержимое: "); foreach(char с in 1st)
Console.Write(с + " ");
Console.WriteLine ();
// Следующая строка кода недопустима из-за // нарушения безопасности обобщенного типа.
// lst.Add(99); // Ошибка, поскольку это не тип char!
}
}
Эта версия программы дает такой же результат, как и предыдущая.
Исходное количество элементов: О
Добавить 6 элементов Количество элементов: 6 Текущее содержимое: С А Е В D F
Удалить 2 элемента Количество элементов: 4 Содержимое: С Е В D
Добавить еще 20 элементов Текущая емкость: 32
Количество элементов после добавления 20 новых: 24 Содержимое: CEBDabcdefghij klmnopqrst
Изменить три первых элемента
Содержимое: XYZDabcdefghij klmnopqrst
Класс 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; }