Урок 35. Коллекция ArrayList C#: часть первая
На этом уроке по C# и .NET мы поговорим об использование класса ArrayList. Этот класс коллекции общего назначения предоставляет возможность создавать и управлять группой связанных объектов, как если бы они были массивом переменной длины.
Коллекция ArrayList
При использовании одномерных массивов массив определяется с фиксированной длиной. Это может быть недостатком, если число элементов, которые будут храниться в массиве, является переменным и неизвестным до времени выполнения.
ArrayList - это коллекция общего назначения, предоставляемая платформой .NET framework. Он хранит набор объектов, который является гибким по размеру и включает в себя функциональные возможности для управления содержимым коллекции, в том числе возможность изменять диапазоны значений, выполнять операции сортировки и поиска содержимого ArrayList.
Реализованные интерфейсы коллекции
В предыдущей статье учебника по основам C# мы рассмотрели интерфейсы, используемые коллекциями. ArrayList реализует ICollection и IList; все свойства и методы, определенные этими интерфейсами, поддерживаются ArrayList. Эти модели поведения не рассматриваются в данной статье. Вместо этого мы рассмотрим дополнительное поведение, специфичное для ArrayLists.
Конструкторы
Класс ArrayList предоставляет три стандартных конструктора, которые позволяют создать экземпляр и заполнить новую коллекцию. Первый - самый простой, не требующий никаких параметров. Новая коллекция создается с возможностью хранения нескольких элементов. Каждый раз, когда емкость превышена, она автоматически удваивается.
Класс ArrayList находится в пространстве имен System.Collections; таким образом, чтобы выполнить примеры, добавьте using System.Collections; к исходному коду.
ArrayList myCollection = new ArrayList();Если максимальное число элементов, которые будут храниться в списке ArrayList, известно до создания коллекции, то его целесообразнее указать. Если этот размер недооценен и впоследствии будет превышен, вместимость все равно будет удвоена для размещения дополнительных предметов. Чтобы объявить начальную емкость ArrayList, введите значение в виде целого числа в конструкторе.
ArrayList myCollection = new ArrayList(5);Третий конструктор для ArrayList позволяет инициализировать все содержимое новой коллекции, используя данные любого другого массива или коллекции, которая поддерживает интерфейс ICollection. Массив или коллекция передается в качестве аргумента конструктору. Каждый элемент добавляется в новый ArrayList в том порядке, в котором они перечисляются из исходной коллекции. В следующем примере используется массив строк для инициализации ArrayList.
string[] fruitArray = new string[] {"Apple", "Banana", "Grape"}; ArrayList fruitCollection = new ArrayList(fruitArray); // Список предметов коллекции foreach (string fruit in fruitCollection) { Console.WriteLine(fruit); } /* Вывод Apple Banana Grape */ArrayList.Repeat
Может быть полезно создать новую коллекцию ArrayList, предварительно заполненную несколькими экземплярами одного и того же значения или объекта. Статический метод Repeat обеспечивает эту функциональность:
ArrayList myCollection = ArrayList.Repeat("upread.ru",5); foreach (string s in myCollection) { Console.WriteLine(s); } /* Вывод upread.ru upread.ru upread.ru upread.ru upread.ru */Примечание: если ArrayList заполняется ссылочным типом с помощью Repeat, все элементы в коллекции будут ссылками на один и тот же объект, то есть изменение свойств одного элемента в коллекции создаст впечатление, что все другие элементы также изменились, поскольку они ссылаются на одни и те же данные. Этого не происходит при заполнении типами значений.
Изменение содержимого ArrayList
ArrayList разработан для обеспечения гибкой коллекции объектов типа массива. Он включает в себя множество методов, которые позволяют изменять его содержание. В следующих разделах описываются методы модификации, которые не были рассмотрены на предыдущем уроке.
Добавление нескольких элементов
ArrayList содержит два метода, которые позволяют добавлять несколько элементов в одной команде. В каждом случае дополнительные элементы хранятся в коллекции или массиве, который реализует ICollection.
Метод AddRange добавляет все содержимое коллекции в конец списка ArrayList. Объект ICollection, содержащий добавляемые элементы, передается как единственный параметр.
ArrayList myCollection = ArrayList.Repeat("Item",3); ArrayList extraItems = ArrayList.Repeat("Extra",2); myCollection.AddRange(extraItems); foreach (string s in myCollection) { Console.WriteLine(s); } /* Вывод Item Item Item Extra Extra */Метод InsertRange предоставляет аналогичную функцию для AddRange. Однако он требует дополнительного параметра для указания индекса, в который должны быть вставлены новые элементы. Существующие элементы в списке ArrayList перемещаются в более высокий индекс, чтобы разрешить вставку.
ArrayList myCollection = ArrayList.Repeat("Item",3); ArrayList extraItems = ArrayList.Repeat("Extra",2); myCollection.InsertRange(1,extraItems); foreach (string s in myCollection) { Console.WriteLine(s); } /* вывод Item Extra Extra Item Item */Удаление нескольких элементов
ArrayLists позволяют удалять диапазон элементов из коллекции в одной команде с помощью метода RemoveRange. RemoveRange принимает два параметра. Первый указывает индекс первого элемента, который будет удален. Второй параметр указывает количество одновременно удаляемых записей коллекции.
ArrayList myCollection = ArrayList.Repeat("Item",5); // удаление трех элементов из ArrayList начиная с первого myCollection.RemoveRange(0,3); foreach (string s in myCollection) { Console.WriteLine(s); } /* вывод Item Item */Замена нескольких элементов
Часто бывает полезно заменить содержимое части одного ArrayList на элементы из другого. Это можно сделать с помощью метода SetRange. SetRange требует двух параметров: индекс первого элемента для перезаписи и коллекция, которая будет использоваться для замены существующих записей из этой позиции вперед. Замещающие элементы должны находиться в массиве или коллекции на основе ICollection.
ArrayList myCollection = ArrayList.Repeat("Item",5); ArrayList newItems = ArrayList.Repeat("New",2); // перезапись myCollection.SetRange(1,newItems); foreach (string s in myCollection) { Console.WriteLine(s); } /* вывод Item New New Item Item */Реверс элементов ArrayList
Класс ArrayList предоставляет метод под названием Reverse(). В своей простейшей форме метод меняет порядок элементов в коллекции, как показано ниже:
ArrayList myCollection = new ArrayList( new string[] {"One", "Two", "Three", "Four", "Five"}); myCollection.Reverse(); foreach (string s in myCollection) { Console.WriteLine(s); } /* вывод Five Four Three Two One */Если необходимо реверсировать только часть содержимого ArrayList, то с помощью метода Reverse используются два целых параметра. Первый указывает индекс первого элемента в коллекции,который должен быть затронут. Второй параметр используется для определения того, сколько элементов в коллекции будет реверсировано. В следующем примере первая и последняя записи в списке ArrayList остаются на своих местах, в то время как середина коллекции перевернута.
ArrayList myCollection = new ArrayList( new string[] {"One", "Two", "Three", "Four", "Five"}); myCollection.Reverse(1,3); foreach (string s in myCollection) { Console.WriteLine(s); } /* вывод One Four Three Two Five */Поиск по ArrayList
Поскольку ArrayList реализует IList, он поддерживает два стандартных метода запроса для списков: Contains и IndexOf. Метод ArrayList предоставляет дополнительные методы, которые можно использовать для поиска содержимого коллекции. Они описаны ниже.
Получение индекса записи
Метод IndexOf интерфейса IList выполняет поиск указанного объекта в коллекции и, если он найден, возвращает индекс первого совпадающего элемента. Эта функциональность расширена для ArrayLists с добавлением двух перегруженных версий метода.
Первая перегруженная версия IndexOf принимает дополнительный целочисленный аргумент, который задает позицию индекса, с которой должен начинаться поиск. Любые элементы с более меньшим исключаются из поиска. Это обеспечивает преимущество по сравнению с базовой версией метода в том, что несколько вхождений одного и того же значения могут быть легко обнаружены.
В следующем примере циклы выполняются до тех пор, пока не будет найдено каждое вхождение текста "Find me". Цикл завершается, когда значение индекса становится равным -1, что указывает на то, что объект поиска не был найден.
ArrayList myCollection = new ArrayList( new string[] {"One", "Two", "Find Me", "Three", "Find Me", "Four", "Find Me", "Five"}); int location = -1; do { location = myCollection.IndexOf("Find Me", location + 1); if (location != -1) { Console.WriteLine("Found at index {0}", location); } } while (location != -1); /* вывод Found at index 2 Found at index 4 Found at index 6 */Второй перегруженный метод IndexOf добавляет второй целочисленный параметр. Второй параметр определяет размер диапазона для поиска в пределах ArrayList. Элементы, которые появляются в коллекции раньше, чем первый индекс или после окончания диапазона поиска, не сопоставляются.
ArrayList myCollection = new ArrayList( new string[] {"One", "Two", "Three", "Four", "Five"}); Console.WriteLine(myCollection.IndexOf("One",1,3)); // -1 Console.WriteLine(myCollection.IndexOf("Three",1,3)); // 2 Console.WriteLine(myCollection.IndexOf("Five",1,3)); // -1Если вы хотите выполнить поиск в обратном направлении от конца ArrayList, используйте метод LastIndexOf Arraylist'а. Параметры, которые могут быть указаны, соответствуют параметрам метода IndexOf. Когда второй аргумент используется для указания размера диапазона, этот диапазон начинается с указанного последнего индекса и отсчитывается назад.
ArrayList myCollection = new ArrayList( new string[] {"One", "Two", "Three", "Four", "Five"}); Console.WriteLine(myCollection.LastIndexOf("One")); // 0 Console.WriteLine(myCollection.LastIndexOf("One",3,3)); // -1
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.