На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Урок 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





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

Читайте также:




Как начинается работа с готовым сайтом
Воспроизведение музыки в формате mp3 на Java


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.