Урок 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, коллекции, уроки по си шарп, ArrayList




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




HTML5 игры: что там у нас внутри
Программа "Черный список"
Почему я пишу программы на заказ на C#?