KnigaRead.com/
KnigaRead.com » Разная литература » Прочее » Герберт Шилдт - C# 4.0 полное руководство - 2011

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн "Герберт Шилдт - C# 4.0 полное руководство - 2011". Жанр: Прочее издательство неизвестно, год неизвестен.
Перейти на страницу:

// Удалить элементы из динамического массива, al.Remove('F'); al.Remove('A');

Console.WriteLine("Количество элементов: " + al.Count);

// Отобразить содержимое динамического массива, используя цикл foreach. Console.Write("Содержимое: "); foreach(char с in al)

Console.Write(с + " ");

Console.WriteLine("n");

Console.WriteLine("Добавить еще 20 элементов");

// Добавить количество элементов, достаточное для // принудительного расширения массива, for (int i=0; i < 20; i++) al.Add((char)('a' + i));

Console.WriteLine("Текущая емкость: " + al.Capacity);

Console.WriteLine("Количество элементов после добавления 20 новых: " + al.Count);

Console.Write("Содержимое: "); foreach(char с in al)

Console.Write(с + " ");

Console.WriteLine("n");

// Изменить содержимое динамического массива,

// используя индексирование массива.

Console.WriteLine("Изменить три первых элемента"); al [0] = 1X1 ; al[1] = 'Y'; al[2] = 'Z';

Console.Write("Содержимое: "); foreach(char с in al)

Console.Write (c + " ");

Console.WriteLine ();

Вот к какому результату приводит выполнение этой программы.

Исходное количество элементов: О

Добавить 6 элементов Количество элементов: 6 Текущее содержимое: С А Е В D F

Удалить 2 элемента Количество элементов: 4 Содержимое: С Е В D

Добавить еще 20 элементов Текущая емкость: 32

Количество элементов после добавления 20 новых: 24 Содержимое: CEBDabcdefghij klmnopqrst

Изменить три первых элемента

Содержимое: XYZDabcdefghij klmnopqrst

Сортировка и поиск в коллекции типа ArrayList

Коллекцию типа ArrayList можно отсортировать с помощью метода Sort (). В этом случае поиск в отсортированной коллекции с помощью метода BinarySearch () становится еще более эффективным. Применение обоих методов демонстрируется в приведенном ниже примере программы.

// Отсортировать коллекцию типа ArrayList и осуществить в ней поиск.

using System;

using System.Collections;

class SortSearchDemo { static void Main() {

// Создать коллекцию в виде динамического массива.

ArrayList al = new ArrayList();

// Добавить элементы в динамический массив.

al.Add(55);

al.Add(43) ;

al.Add(-4);

al.Add(88);

al.Add(3);

al.Add(19) ;

Console.Write("Исходное содержимое: "); foreach(int i in al)

Console.Write (i + " ");

Console.WriteLine ("n");

// Отсортировать динамический массив, al.Sort();

// Отобразить содержимое динамического массива, используя цикл foreach.

Console..Write ("Содержимое после сортировки: ") ; foreach (int i in al)

Console.Write (i + " ");

Console.WriteLine ("n");

Console.WriteLine("Индекс элемента 43: " + al.BinarySearch (43));

}

}

Ниже приведен результат выполнения этой программы.

Исходное содержимое: 55 43 -488 3 19

Содержимое после сортировки: -4 3 19 43 55 88

Индекс элемента 43: 3

В одной и той же коллекции типа ArrayList могут храниться объекты любого типа. Тем не менее во время сортировки и поиска в ней эти объекты приходится сравнивать. Так, если бы список объектов в приведенном выше примере программы содержал символьную строку, то их сравнение привело бы к исключительной ситуации. Впрочем, для сравнения символьных строк и целых чисел можно создать специальные методы. О таких методах сравнения речь пойдет далее в этой главе.

Получение массива из коллекции типа ArrayList

В работе с коллекцией типа ArrayList иногда требуется получить из ее содержимого обычный массив. Этой цели служит метод ТоАггау (). Для преобразования коллекции в массив имеется несколько причин. Две из них таковы: потребность в ускорении обработки при выполнении некоторых операций и необходимость передавать массив методу, который не перегружается, чтобы принять коллекцию. Но независимо от конкретной причины коллекция типа ArrayList преобразуется в обычный^лассив довольно просто, как показано в приведенном ниже примере программы.

// Преобразовать коллекцию типа ArrayList в обычный массив.

using System;

using System.Collections;

class ArrayListToArray { static void Main() {

ArrayList al = new ArrayList();

// Добавить элементы в динамический массив, al.Add(1); al.Add(2); al.Add(3) ; al.Add(4) ;

Console.Write("Содержимое: "); foreach(int i in al)

Console.Write(i + " ");

Console.WriteLine();

int[] ia = (int[]) al.ToArray(typeof(int)); int sum = 0;

// Просуммировать элементы массива, for(int i=0; icia.Length; i++) sum += ia[i];

Console.WriteLine("Сумма равна: " + sum);

}

}

Эта программа дает следующий результат.

Содержимое: 1 2 3 4 Сумма равна: 10

В начале этой программы создается коллекция целых чисел. Затем в ней вызывается метод ToArray () с указанием типа int получаемого массива. В итоге создается целочисленный массив. Но поскольку Array является типом, возвращаемым методом ToArray (), то содержимое получаемого в итоге массива должно быть приведено к типу int [ ]. (Напомним, что Array является базовым типом для всех массивов в С#.) И наконец, значения всех элементов массива суммируются.

Класс Hashtable

Класс Hashtable предназначен для создания коллекции, в которой для хранения ее элементов служит хеш-таблица. Как должно быть известно большинству читателей, информация сохраняется в хеш-таблице с помощью механизма, называемого хешированием. При хешировании для определения уникального значения, называемого хеш-кодом, используется информационное содержимое специального ключа. Полученный в итоге хеш-код служит в качестве индекса, по которому в таблице хранятся искомые данные, соответствующие заданному ключу. Преобразование ключа в хеш-код выполняется автоматически, и поэтому сам хеш-код вообще недоступен пользователю. Преимущество хеширования заключается в том, что оно обеспечивает постоянство времени выполнения операций поиска, извлечения и установки значений независимо от величины массивов данных. В классе Hashtable реализуются интерфейсы I Dictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback и ICloneable.

В классе Hashtable определено немало конструкторов. Ниже приведены наиболее часто используемые конструкторы этого класса.

public Hashtable () public Hashtable(IDictionary d) public Hashtable(int capacity) public Hashtable(int capacity,

float loadFactor)

В первой форме создается создаваемый по умолчанию объект класса Hashtable. Во второй форме создаваемый объект типа Hashtable инициализируется элементами из коллекции d. В третьей форме создаваемый объект типа Hashtable инициализируется, учитывая емкость коллекции, задаваемую параметром capacity. И в четвертой форме создаваемый объект типа Hashtable инициализируется, учитывая заданную емкость capacity и коэффициент заполнения loadFactor. Коэффициент заполнения, иногда еще называемый коэффициентом загрузки, должен находиться в пределах

от ОД до 1,0. Он определяет степень заполнения хеш-таблицы до увеличения ее размера. В частности, таблица расширяется, если количество элементов оказывается больше емкости таблицы, умноженной на коэффициент заполнения. В тех конструкторах, которые не принимают коэффициент заполнения в качестве параметра, этот коэффициент по умолчанию выбирается равным 1,0.

В классе Hashtable определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса приведены в табл. 25.5. В частности, для того чтобы определить, содержится ли ключ в коллекции типа Hashtable, вызывается метод Contains Key (). А для того чтобы выяснить, хранится ли в такой коллекции конкретное значение, вызывается метод ContainsValue (). Для перечисления содержимого коллекции типа Hashtable служит метод GetEnumerator (), возвращающий объект типа IDictionaryEnumerator. Напомним, что IDictionaryEnumerator — это перечислитель, используемый для перечисления содержимого коллекции, в которой хранятся пары "ключ-значение".

Таблица 25.5. Наиболее часто используемые методы, определенные в классе Hashtable

Метод

Описание

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