Страница 464 из 502
<b> Console.Write(ch + " ");</b>
<b> Console.WriteLine("n");</b>
<b> // Отобразить связный список, обойдя его</b>
<b> // вручную в обратном направлении.</b>
<b> Console.Write("Следовать по ссылкам в обратном направлении: ");</b>
<b> for(node = ll.Last; node != null; node = node.Previous)</b>
<b> Console.Write(node.Value + " ");</b>
<b> Console.WriteLine ("n");</b>
<b> // Удалить из списка два элемента.</b>
<b> Console.WriteLine("Удалить 2 элемента из списка");</b>
<b> // Удалить элементы из связного списка.</b>
<b> ll.Remove('С');</b>
<b> ll.Remove('А');</b>
<b> Console.WriteLine("Количество элементов в списке: " + ll.Count);</b>
<b> // Отобразить содержимое видоизмененного списка в цикле foreach.</b>
<b> Console.Write("Содержимое списка после удаления элементов: ");</b>
<b> foreach(char ch in ll)</b>
<b> Console.Write(ch + " ");</b>
<b> Console.WriteLine ("n");</b>
<b> // Добавить три элемента в конец списка.</b>
<b> ll.AddLast('X');</b>
<b> ll.AddLast('Y');</b>
<b> ll.AddLast('Z');</b>
<b> Console.Write("Содержимое списка после ввода элементов: ");</b>
<b> foreach(char ch in ll)</b>
<b> Console.Write(ch + " ");</b>
<b> Console.WriteLine("n");</b>
<b> }</b>
<b>}</b>
Ниже приведен результат выполнения этой программы.
<b>Исходное количество элементов в списке: 0</b>
<b>Добавить в список 5 элементов</b>
<b>Количество элементов в списке: 5</b>
<b>Отобразить содержимое списка по ссылкам: Е D С В А</b>
<b>Отобразить содержимое списка в цикле foreach: Е D С В А</b>
<b>Следовать по ссылкам в обратном направлении: А В С D Е</b>
<b>Удалить 2 элемента из списка</b>
<b>Количество элементов в списке: 3</b>
<b>Содержимое списка после удаления элементов: Е D В</b>
<b>Содержимое списка после ввода элементов: Е D В X Y Z</b>
Самое примечательное в этой программе — это обход списка в прямом и обратном направлении, следуя по ссылкам, предоставляемым свойствами Next и Previous. Двунаправленный характер подобных связных списков имеет особое значение для приложений, управляющих базами данных, где нередко требуется перемещаться по списку в обоих направлениях.
Класс Dictionary<TKey, TValue> позволяет хранить пары "ключ-значение" в коллекции как в словаре. Значения доступны в словаре по соответствующим ключам. В этом отношении данный класс аналогичен необобщенному классу Hashtable. В классе Dictionary<TKey, TValue> реализуются интерфейсы IDictionary, IDictionary<TKey, TValue>, ICollection, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable, IEnumerable<KeyValuePair<TKey, TValue>>, ISerializable и IDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. Словари имеют динамический характер, расширяясь по мере необходимости.
В классе Dictionary<TKey, TValue> предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые из них.
<b>public Dictionary()</b>
<b>public Dictionary(IDictionaryCTKey, TValue> <i>dictionary)</i></b>
<b>public Dictionary(int <i>capacity)</i></b>
В первом конструкторе создается пустой словарь с выбираемой по умолчанию первоначальной емкостью. Во втором конструкторе создается словарь с указанным количеством элементов dictionary. А в третьем конструкторе с помощью параметра capaci ty указывается емкость коллекции, создаваемой в виде словаря. Если размер словаря заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера словаря во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов.
В классе Dictionary<TKey, TValue> определяется также ряд методов. Некоторые наиболее часто используемые методы этого класса сведены в табл. 25.17.
Таблица 25.17. Наиболее часто используемые методы, определенные в классе Die tionaryCTKey, TValue>
Метод - Описание
public void Add(TKey key, TValue value) - Добавляет в словарь пару “ключ-значение", определяемую параметрами key и value. Если ключ key уже находится в словаре, то его значение не изменяется, и генерируется исключение ArgumentException