Главная страница
Навигация по странице:

  • Сортировка ArrayList-массивов и выполнение поиска

  • Создание обычного массива из динамического

  • Класс Hashtable

  • Метод

  • Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией


    Скачать 5.05 Mb.
    НазваниеСправочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
    АнкорC #.pdf
    Дата08.12.2017
    Размер5.05 Mb.
    Формат файлаpdf
    Имя файлаC #.pdf
    ТипСправочник
    #10795
    страница42 из 52
    1   ...   38   39   40   41   42   43   44   45   ...   52
    Метод
    Описание
    public virtual void AddRange(
    ICollection
    с
    )
    Добавляет элементы из коллекции
    с
    в конец вызывающей коллекции public virtual int
    BinarySearch( object
    v
    )
    В вызывающей коллекции выполняет поиск значения, заданного параметром
    v
    . Возвращает индекс найденного элемента. Если искомое значение не обнаружено, возвращает отрицательное значение. Вызывающий список должен быть отсортирован

    618
    Часть II. Библиотека C#
    Продолжение табл. 22.4
    Метод
    Описание
    public virtual int
    BinarySearch( object
    v
    ,
    ICotnparer
    comp
    )
    В вызывающей коллекции выполняет поиск значения, заданного параметром
    v
    , на основе метода сравнения объектов, заданного параметром
    comp
    . Возвращает индекс найденного элемента.
    Если искомое значение не обнаружено, возвращает отрицательное значение. Вызывающий список должен быть отсортирован public virtual int
    BinarySearch( int
    startIdx
    , int
    count
    , object
    v
    ,
    IComparer
    comp
    )
    В вызывающей коллекции выполняет поиск значения, заданного параметром
    v
    , на основе метода сравнения объектов, заданного параметром
    comp
    . Поиск начинается с элемента, индекс которого равен значению
    startIdx
    , и включает
    count
    элементов. Метод возвращает индекс найденного элемента.
    Если искомое значение не обнаружено, возвращает отрицательное значение. Вызывающий список должен быть отсортирован public virtual void CopyTo(
    Array
    ar
    , int
    startIdx
    )
    Копирует содержимое вызывающей коллекции, начиная с элемента, индекс которого равен значению
    startIdx
    , в массив, заданный параметром
    ar
    . Приемный массив должен быть одномерным и совместимым по типу с элементами коллекции public virtual void CopyTo( int
    srcIdx
    ,
    Array
    ar
    , int
    destIdx
    , int
    count
    )
    Копирует
    count
    элементов вызывающей коллекции, начиная с элемента, индекс которого равен значению
    srcIdx
    , в массив, заданный параметром
    ar
    , начиная с элемента, индекс которого равен значению
    destIdx
    . Приемный массив должен быть одномерным и совместимым по типу с элементами коллекции public virtual ArrayList
    GetRange( int
    idx
    , int
    count
    )
    Возвращает часть вызывающей коллекции типа
    ArrayList
    Диапазон возвращаемой коллекции начинается с индекса
    idx
    и включает
    count
    элементов. Возвращаемый объект ссылается на те же элементы, что и вызывающий объект public static ArrayList
    FixedSize(
    ArrayList
    ar
    )
    Превращает коллекцию
    ar
    в
    ArrayList
    -массив с фиксированным размером и возвращает результат public virtual void
    InsertRange( int
    startIdx
    ,
    ICollection
    c
    )
    Вставляет элементы коллекции, заданной параметром
    с
    , в вызывающую коллекцию, начиная с индекса, заданного параметром
    startIdx
    public virtual int
    LastIndexOf( object
    v
    )
    Возвращает индекс последнего вхождения объекта
    v
    в вызывающей коллекции. Если искомый объект не обнаружен, возвращает значение -1 public static ArrayList
    ReadOnly(ArrayList
    ar
    )
    Превращает коллекцию
    ar
    в
    ArrayList
    -массив, предназначенный только для чтения, и возвращает результат public virtual void
    RemoveRange( int
    idx
    , int
    count
    )
    Удаляет
    count
    элементов из вызывающей коллекции, начиная с элемента, индекс которого равен значению
    idx
    public virtual void
    Reverse()
    Располагает элементы вызывающей коллекции в обратном порядке public virtual void
    Reverse(int
    startIdx
    , int
    count
    )
    Располагает в обратном порядке
    count
    элементов вызывающей коллекции, начиная с индекса
    startIdx
    public virtual void
    SetRange(int
    startIdx
    ,
    ICollection
    c
    )
    Заменяет элементы вызывающей коллекции, начиная с индекса
    startIdx
    , элементами коллекции, заданной параметром
    с
    public virtual void Sort()
    Сортирует коллекцию по возрастанию public virtual void Sort(
    IComparer
    comp
    )
    Сортирует вызывающую коллекцию на основе метода сравнения объектов, заданного параметром
    comp
    . Если параметр
    comp
    имеет нулевое значение, для каждого объекта используется стандартный метод сравнения

    Глава 22. Работа с коллекциями
    619
    Окончание табл. 22.4
    Метод
    Описание
    public virtual void Sort( int
    startIdx
    , int
    endIdx
    ,
    IComparer
    comp
    )
    Сортирует часть вызывающей коллекции на основе метода сравнения объектов, заданного параметром
    comp
    . Сортировка начинается с индекса
    startIdx
    и заканчивается индексом
    endIdx
    . Если параметр comp имеет нулевое значение, для каждого объекта используется стандартный метод сравнения public static ArrayList
    Synchronized(
    ArrayList
    list
    )
    Возвращает синхронизированную версию вызывающей коллекции public virtual object[]
    ToArray()
    Возвращает массив, который содержит копии элементов вызывающего объекта public virtual Array
    ToArray(
    Type
    type
    )
    Возвращает массив, который содержит копии элементов вызывающего объекта. Тип элементов в этом массиве задается параметром
    type
    public virtual void
    TrimToSize()
    Устанавливает свойство
    Capacity равным значению свойства
    Count
    Помимо свойств, определенных в интерфейсах, реализуемых классом
    ArrayList
    , в нем также определено свойство
    Capacity
    : public virtual int Capacity { get; set; }
    Свойство
    Capacity позволяет узнать или установить емкость вызывающего динамического массива типа
    ArrayList
    . Емкость представляет собой количество элементов, которые можно сохранить в
    ArrayList
    -массиве без его увеличения. Как упоминалось выше,
    ArrayList
    -массив увеличивается автоматически, и поэтому нет необходимости устанавливать его емкость вручную. Но если вам заранее известно, сколько элементов должно содержаться в
    ArrayList
    -массиве, то из соображений эффективности в установке свойства
    Capacity есть резон. Тем самым вы сэкономите системные ресурсы, затрачиваемые на выделение дополнительной памяти.
    И наоборот, если вы захотите уменьшить размер
    ArrayList
    -массива, то путем соответствующей установки свойства
    Capacity можно сделать его меньшим. Однако это значение не должно быть меньше значения свойства
    Count
    . Вспомните, что свойство
    Count
    , определенное в интерфейсе
    ICollection
    , содержит реальное количество объектов, хранимых в коллекции в данный момент. Попытка установить свойство
    Capacity равным значению, которое меньше значения свойства
    Count
    , приведет к генерированию исключения типа
    ArgumentOutOfRangeException
    . Чтобы сделать емкость
    ArrayList
    -массива равной действительному количеству элементов, хранимых в нем в данный момент, установите свойство
    Capacity равным свойству
    Count
    . Того же эффекта можно добиться, вызвав метод
    TrimToSize()
    Использование динамического массива типа
    ArrayList демонстрируется в следующей программе. Сначала она создает
    ArrayList
    -массив, а затем добавляет в него символы и отображает их. После удаления элементов список отображается снова.
    Последующее добавление новых элементов приводит к автоматическому увеличению емкости используемого списка. На “десерт” демонстрируется возможность изменения содержимого его элементов.
    // Демонстрация использования ArrayList-массива. using System; using System.Collections; class ArrayListDemo { public static void Main() {

    620
    Часть II. Библиотека C#
    //
    Создаем динамический массив.
    ArrayList al = new ArrayList();
    Console.WriteLine("Начальная емкость: " + al.Capacity);
    Console.WriteLine("Начальное количество элементов: " + al.Count);
    Console.WriteLine();
    Console.WriteLine("Добавляем 6 элементов.");
    //
    Добавляем элементы в динамический массив. al.Add('С'); al.Add('A'); al.Add('E'); al.Add('B'); al.Add('D'); al.Add('F');
    Console.WriteLine("Текущая емкость: " + al.Capacity);
    Console.WriteLine("Количество элементов: " + al.Count);
    //
    Отображаем массив, используя индексацию.
    Console.Write("Текущее содержимое массива: "); for(int i=0; i < al.Count; i++)
    Console.Write(al[i] + " ");
    Console.WriteLine("\n");
    Console.WriteLine("Удаляем 2 элемента.");
    //
    Удаляем элементы из динамического массива. al.Remove('F'); al.Remove('A');
    Console.WriteLine("Текущая емкость: " + al.Capacity);
    Console.WriteLine("Количество элементов: " + al.Count);
    //
    Для отображения массива используем цикл foreach.
    Console.Write("Содержимое: "); foreach(char c in al)
    Console.Write(c + " ");
    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 c in al)

    Глава 22. Работа с коллекциями
    621
    Console.Write(c + " ");
    Console.WriteLine("\n");
    //
    Изменяем содержимое массива, используя индексацию.
    Console.WriteLine("Изменяем первые три элемента."); al[0] = 'X'; al[1] = 'Y'; al[2] = 'Z';
    Console.Write("Содержимое: "); foreach(char c in al)
    Console.Write(c + " ");
    Console.WriteLine();
    }
    }
    Результаты выполнения программы таковы:
    Начальная емкость: 16
    Начальное количество элементов: 0
    Добавляем 6 элементов.
    Текущая емкость: 16
    Количество элементов: 6
    Текущее содержимое массива: С А Е В D F
    Удаляем 2 элемента.
    Текущая емкость: 16
    Количество элементов: 4
    Содержимое: С Е В D
    Добавляем еще 20 элементов.
    Текущая емкость: 32
    Количество элементов после добавления 20 новых: 24
    Содержимое: C E B D a b c d e f g h i j k l m n o p q r s t
    Изменяем первые три элемента.
    Содержимое: X Y Z D a b c d e f g h i j k l m n o p q r s t
    Обратите внимание на то, что коллекция с самого начала работы этой программы пуста, но ее начальная емкость равна 16. При необходимости коллекция увеличивается, причем каждый раз, когда возникает такая необходимость, емкость удваивается.
    Сортировка ArrayList-массивов и выполнение поиска
    Динамический массив типа
    ArrayList можно отсортировать с помощью метода
    Sort()
    . В отсортированном массиве можно эффективно выполнить поиск элемента, используя метод
    BinarySearch()
    . Применение упомянутых методов демонстрируется следующей программой:
    // Сортировка ArrayList-массива и поиск в нем
    // заданного элемента. using System; using System.Collections; class SortSearchDemo { public static void Main() {
    //
    Создаем динамический массив.
    ArrayList al = new ArrayList();

    622
    Часть II. Библиотека C#
    //
    Добавляем в него элементы. 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("Индекс элемента 4 3 равен " + al.BinarySearch(43));
    }
    }
    Вот результаты выполнения программы:
    Исходное содержимое: 55 43 -4 88 3 19
    Содержимое после сортировки: -4 3 19 43 55 88
    Индекс элемента 4 3 равен 3
    Несмотря на то что
    ArrayList
    -массив может в одном списке хранить объекты любого типа, прежде чем выполнять сортировку или поиск объектов, необходимо обеспечить возможность сравнения объектов списка. Например, предыдущая программа сгенерировала бы исключение, если рассматриваемый список включал бы строку.
    (Конечно, программист может создавать собственные методы сравнения, например, строк и целочисленных значений. О пользовательских компараторах речь пойдет ниже в этой главе.)
    Создание обычного массива из динамического
    При работе с
    ArrayList
    -массивом иногда нужно получить обычный массив, который бы содержал элементы динамического. Это можно сделать с помощью метода
    ToArray()
    . Существует ряд причин для преобразования коллекции в массив. Во-первых, для определенных операций иногда важно сократить время обработки. Во-вторых, возможны ситуации, когда необходимо передать массив методу, который не перегружен для приема коллекции. В любом случае преобразование
    ArrayList
    -коллекции в массив не представляет сложности, и в этом легко убедиться, рассмотрев следующую программу:
    // Преобразование ArrayList-коллекции в массив. using System; using System.Collections;

    Глава 22. Работа с коллекциями
    623 class ArrayListToArray { public 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; i+= ia[i];
    Console.WriteLine("Сумма равна: " + sum);
    }
    }
    Результаты выполнения этой программы таковы:
    Содержимое: 1 2 3 4 Сумма равна: 10
    Эта программа начинается с создания коллекции целочисленных значений. Затем вызывается метод
    ToArray()
    , который принимает в качестве параметра тип int
    . Это обеспечивает создание массива целочисленных значений. Поскольку в качестве типа значения, которое возвращает метод
    ToArray()
    , указан тип
    Array
    , содержимое создаваемого массива должно быть приведено к типу int[]
    , Наконец, суммирование значений обычного массива — вообще пара пустяков.
    Класс Hashtable
    Класс
    Hashtable предназначен для создания коллекции, в которой для хранения объектов используется хеш-таблица. Возможно, многим известно, что в хеш-таблице для хранения информации используется механизм, именуемый хешированием (hashing). Суть хеширования состоит в том, что для определения уникального значения, которое называется хеш-кодом, используется информационное содержимое соответствующего ему ключа. Хеш-код затем используется в качестве индекса, по которому в таблице отыскиваются данные, соответствующие этому ключу. Преобразование ключа в хеш-код выполняется автоматически, т.е. сам хеш-код вы даже не увидите. Но преимущество хеширования — в том, что оно позволяет сохранять постоянным время выполнения таких операций, как поиск, считывание и запись данных, даже для больших объемов информации.
    Класс
    Hashtable реализует интерфейсы
    IDictionary
    ,
    ICollection
    ,
    IEnumerable
    ,
    ISerializable
    ,
    IDeserializationCallback и
    ICloneable
    В классе
    Hashtable определено множество конструкторов, включая следующие
    (они используются чаше всего): public Hashtable() public Hashtable(IDictionary
    с
    )

    624
    Часть II. Библиотека C# public Hashtable(int
    capacity
    ) public Hashtable(int
    capacity
    , float
    fillRatio
    )
    Первая форма позволяет создать стандартный объект класса
    Hashtable
    . Вторая для инициализации
    Hashtable
    -объекта использует элементы заданной коллекции
    с
    . Третья инициализирует емкость создаваемой хеш-таблицы значением
    capacity
    , a четвертая — как емкость (значением
    capacity
    ), так и коэффициент заполнения (значением
    fillRatio
    ). Значение коэффициента заполнения (также именуемого коэффициентом нагрузки), которое должно попадать в диапазон 0,1-1,0, определяет степень заполнения хеш-таблицы, после чего ее размер увеличивается. В частности, размер таблицы увеличится, когда количество элементов станет больше емкости таблицы, умноженной на ее коэффициент заполнения. Для конструкторов, которые в качестве параметра не принимают коэффициент заполнения, используется значение 1,0.
    В классе
    Hashtable помимо методов, определенных в реализованных им интерфейсах, также определены собственные методы. Наиболее употребимые из них перечислены в табл. 22.5. Чтобы определить, содержит ли
    Hashtable
    -коллекция заданный ключ, достаточно вызвать метод
    ContainsKey()
    . А чтобы узнать, хранится ли в интересующей вас хеш-таблице заданное значение, вызовите метод
    ContainsValue()
    Для опроса элементов
    Hashtable
    -коллекции необходимо получить нумератор типа
    IDictionaryEnumerator
    , вызвав метод
    GetEnumerator()
    . Вспомните, что для опроса содержимого коллекции, в которой хранятся пары ключ/значение, используется именно класс
    IDictionaryEnumerator
    Таблица 22.5. Наиболее употребимые методы класса Hashtable
    Метод
    Описание
    public virtual bool
    ContainsKey( object
    k
    )
    Возвращает значение true
    , если в вызывающей
    Hashtabie
    - коллекции содержится ключ, заданный параметром
    k
    . В противном случае возвращает значение fаlsе public virtual bool
    ContainsValue( object
    v
    )
    Возвращает значение true
    , если в вызывающей
    Hashtable
    - коллекции содержится значение, заданное параметром
    v
    . В противном случае возвращает значение false public virtual
    IDictionaryEnumerator
    GetEnumerator()
    Возвращает для вызывающей
    Hashtable
    -коллекции нумератор типа
    IDictionaryEnumerator public static Hashtable
    Synchronized(
    Hashtable
    ht
    )
    Возвращает синхронизированную версию вызывающей
    Hashtable
    -коллекции, переданной в параметре
    ht
    В классе
    Hashtable
    , помимо свойств, определенных в реализованных им интерфейсах, также определены два собственных public
    -свойства. Используя следующие свойства, можно из
    Hashtable
    -коллекции получить коллекцию ключей или значений: public virtual ICollection Keys { get; } public virtual ICollection Values { get; }
    Поскольку в классе
    Hashtable не предусмотрена поддержка упорядоченных коллекций, при получении коллекции ключей или значений заданный порядок элементов не достигается. В классе
    Hashtable также определены два protected
    -свойства с именами
    Hcp и
    Comparer
    , которые доступны для производных классов.
    В классе
    Hashtable пары ключ/значение хранятся в форме структуры типа
    DictionaryEntry
    , но по большей части вас это не будет касаться, поскольку свойства и методы обрабатывают ключи и значения отдельно. Например, при добавлении элемента в
    Hashtable
    -коллекцию необходимо вызвать метод
    Add()
    , который принимает два отдельных аргумента: ключ и значение.

    Глава 22. Работа с коллекциями
    1   ...   38   39   40   41   42   43   44   45   ...   52


    написать администратору сайта