Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 28

Console.WriteLine ("\nCollection has:\n");

foreach (DictionaryEntry e in ht)

{

  switch (e.Key.GetType().FullName) // Выясняем тип ключевого объекта

  {

    case "MyConsole.Man":    nMen++;      break;

    case "System.String":    nStrings++;  break;

    default: Console.WriteLine("Other: ({0},{1})", e.Key, e.Value); break;

  }

}

Console.WriteLine("Men: {0}\nStrings: {1}", nMen, nStrings); // Подведем итог

Покажем, как пользоваться перечислителем при управлении коллекцией типа HashTable.

Hashtable ht = new Hashtable();

ht.Add (Math.PI, "PI");          // Заполняем коллекцию разнородными парами

ht.Add ("Computer Courses", "www.Avalon.ru");

ht.Add ("Zenith - Spartak", 3.2);

ht.Add ("Date", DateTime.Now);

ht.Add ("Mary", "I love you");

IDictionaryEnumerator en = ht.GetEnumerator(); // Перечислитель коллекции

while (en.MoveNext())   // Пользуемся им для прохода по всем парам

  Console.WriteLine (en.Key.ToString().PadLeft(25) + " : " + en.Value.ToString());

Структура DateTime и ее статическое свойство Now позволяет определить текущее локальное время в данном компьютере. Для разнообразия мы выбрали метод PadLeft класса string, который (a la Hollywood cast list) подбивает пробелами строки (слева), выравнивая тем самым правые края строк. Обратите внимание на отсутствие упорядоченности при выводе элементов коллекции (точнее, на ее непредсказуемый характер).

Упорядоченная последовательность

Если вы хотите иметь упорядоченную последовательность ключей и ассоциированных с ними значений, то можете воспользоваться услугами класса SortedList. Он сортирует последовательность ключей и поддерживает тем самым порядок расположения элементов во всей коллекции. Сортировка производится в момент вставки элемента в коллекцию. Изменить режим сортировки уже существующей коллекции невозможно.

При создании упорядоченной последовательности придется отказаться от полной свободы (скорее анархии) в выборе типов данных, которую мы продемонстрировали в предыдущем примере. Коллекция должна быть однородной. Термин List, использованный в имени типа коллекции, вероятно, намекает нам на то, что коллекция не является «чистым» представителем хешируемой таблицы. Действительно, при выборе элемента коллекции типа SortedList можно пользоваться как ключем, так и целочисленным индексом.

Следующий пример иллюстрирует упорядоченность, которую поддерживает класс SortedList. Способ доступа к элементам коллекции мы оставили прежним. Затем мы изменим тип элементов и способ доступа к ним с целью иллюстрации особенностей выбранного типа коллекции.

SortedList sl = new SortedList();     // Создаем упорядоченный ассоциативный список

sl.Add (Math.PI, "PI");            sl.Add (Math.E, "E");

sl.Add (Math.Sqrt (2), "Sqrt(2)");   sl.Add (Math.Pow (2, 24), "Colors");

IDictionaryEnumerator en = sl.GetEnumerator();

while (en.MoveNext())

  Console.WriteLine(en.Key.ToString().PadLeft(25) + " : " + en.Value.ToString());

Сортируемый список SortedList (на самом деле — ассоциативный контейнер) имеет свойства, некоторые из которых мы используем в следующем примере. Обратите также внимание на способ доступа к элементам контейнера с помощью индекса (GetKey(i) и GetByIndex(i)). Доступ с помощью ключа осуществляется обычным способом, но здесь важно не забыть ввести кавычки, которые, как и в языке С++, ограничивают строковые литералы.

SortedList sl = new SortedList();

sl.Add ("SortedList", "Sorted keys and values");// Пары типа (string, string)

sl.Add ("BitArray", "Compact array of bit values");

sl.Add ("ArrayList", "Dynamic array");

sl.Add ("DictionaryBase", "Needed to сreate custom collections");

Console.WriteLine (" List Capacity: {0}\n\n", sl.Capacity); // Допустимое кол-ва элементов