Пространство имен System.Collections (необобщенные коллекции) содержит интерфейсы и классы, которые определяют различные коллекции объектов, такие как списки, очереди, двоичные массивы, хэш-таблицы и словари.
В классе ArrayList поддерживаются динамические массивы, расширяющиеся и сокращающиеся по мере необходимости, сравните их с массивами класса System.Array. Важно, что элементы коллекции могут быть разнородными (heterogeneous) объектами.
Когда это может быть полезным?
В языке C# стандартные массивы имеют фиксированную длину, которая не может изменяться во время выполнения программы. Это означает, что количество элементов в массиве нужно знать заранее.
Но иногда требуемая конкретная длина массива остается неизвестной до самого момента выполнения программы. Именно для таких ситуаций и предназначен класс ArrayList.
В классе ArrayList определяется массив переменной длины, который состоит из ссылок на объекты и может динамически увеличивать и уменьшать свой размер.
Массив типа ArrayList создается с первоначальным размером. Если этот размер превышается, то массив автоматически расширяется. А при удалении объектов из такого массива он автоматически сокращается.
Коллекции класса ArrayList широко применяются в практике программирования на C#. Многие способы применения коллекций класса ArrayList распространяются и на другие коллекции, в том числе и на обобщенные (аналогичный класс List<T>) . В классе ArrayList реализуются интерфейсы ICollection, IList, IEnumerable и ICloneable.
Рассмотрим пример:
using System; using System.Collections; namespace ConsoleApplication1 { class Program { // делегат delegate void DPrint(ArrayList a); static void Main(string[] args) { ArrayList a = new ArrayList(); // Лямбда-выражение (лямбда оператора) // print - экземпляр делегата DPrint print = (b) => { foreach (object o in b) Console.WriteLine(o); Console.WriteLine("_____"); }; Console.WriteLine("элементов - " + a.Count); print(a); a.Add("Петр"); // добавить элемент a.Add("Сергей"); a.Add("Яков"); a.Add("Артур"); a.Add("007"); Console.WriteLine("элементов - " + a.Count); print(a); a.RemoveAt(1); // удалить 1-й Console.WriteLine("элементов - " + a.Count); print(a); a.Sort(); // сортировка print(a); int k = a.BinarySearch("Петр"); // Бинарный поиск Console.WriteLine("элемент - " + k.ToString()); a.Reverse(); // наоборот print(a); k = a.BinarySearch("Петр"); // Бинарный поиск Console.WriteLine("элемент - " + k.ToString()); Console.ReadKey(); } } }
Заметим, что для вывода элементов коллекции используется делегат, определяемый через лямбда-выражение, смотри также статью Делегаты и анонимные функции.
Результат:
Заметим, что если вы уберете двойные кавычки у объекта 007, то его тип станет числовым (Int32), значение будет равно 7, а в методе сортировки вы получите исключительную ситуацию: System.InvalidOperationException (сбой при сравнении двух элементов массива). При использовании обобщенных коллекций (класс List<T>), такие ситуации не возникнут.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.