Когда использовать ArrayList над массивом [] в С#?

Я часто использую ArrayList вместо "normal" array[].

Мне кажется, что я обманываю (или ленив), когда я использую ArrayList, когда можно использовать ArrayList по массиву?

Ответ 1

Массивы строго типизированы и хорошо работают как параметры. Если вы знаете длину своей коллекции и она исправлена, вы должны использовать массив.

ArrayLists не являются строго типизированными, для каждой вставки или для Retrial требуется возврат, чтобы вернуться к исходному типу. Если вам нужен метод для получения списка определенного типа, ArrayLists не подходят, потому что вы можете передать ArrayList, содержащий любой тип. ArrayLists используют динамически расширяющийся массив внутри, поэтому есть также возможность увеличить размер внутреннего массива, когда он достигает своей емкости.

То, что вы действительно хотите использовать, - это общий список, например List<T>. Это имеет все преимущества массивов и массивов. Он строго типизирован и поддерживает переменную длину элементов.

Ответ 2

В дополнение к ответу Боба и Фредерика я хотел бы указать на то, что в то время как массивы имеют ковариацию, общих списков нет. Например, массив типа MyChildClass[] можно легко отличить до MyParentClass[], а List<MyChildClass> не может быть отправлен на List<MyParentClass>, по крайней мере, не напрямую.

Если вам нужна ковариация, используйте либо массивы, либо используйте метод LINQ Cast(), либо некоторые другие средства для каждого отдельного элемента или ждать С# 4.

Ответ 3

Еще одна мысль здесь - мутация; массив (T[]) полностью изменен и не может быть защищен. List<T> не предоставляет никаких полезных точек расширения, но такие вещи, как Collection<T> (или многие другие реализации IList<T>), позволяют вам добавлять код, например, для проверки элементов до их добавления; Аналогично, вы можете иметь только версии IList<T>, которые полезны для безопасности потоков, где желательно неизменность.

Я обычно использую массивы либо во внутренней логике метода (возможно, в качестве локальной переменной), либо в аргументах params, либо в нескольких высоко оптимизированных случаях, когда я знаю длину элементов, и я знаю, что код не выбирает для его изменения (как частного поля). Помимо этого, List<T> и т.д., Как правило, более распространены, поскольку при добавлении/удалении элементов у них гораздо меньше накладных расходов.

Ответ 4

Если эта часть кода абсолютно критична для производительности, использование ArrayList отлично.

Ответ 5

Лучше, везде, где вы используете ArrayList, вместо этого используйте коллекцию List<T>. Он более строго типизирован, чем первый.

Ответ 6

Я отвечаю на это с точки зрения Java, но это та же самая основная проблема. Вы не должны чувствовать себя виноватым, используя более высокие абстракции. В конце концов, вы используете String вместо char[] или даже byte[]? Я даже предлагаю сделать еще один шаг и использовать интерфейс List, где это возможно. Единственная причина для перехода на один шаг - это по соображениям производительности.

Использование более высокой абстракции коллекции имеет много преимуществ. Вы можете добавить декораторов, чтобы сделать Список доступным только для чтения, зафиксировать размер, проверить элементы, которые вводят или оставляют коллекцию или используют представления (см. GetRange в С# и subList в Java.)

Кстати, ArrayList всегда должен основываться на примитивном массиве, иначе имя неверно. Обычно операции выполняются так, как вы ожидали бы при использовании примитивного массива. Если используется связанный список, он обычно называется именно так: LinkedList. Это также преимущество использования интерфейса: вы можете изменить свое мнение о используемой реализации позже.

Есть несколько вещей, которые делают использование коллекций неуклюжим. Одно из предостережений состоит в том, что коллекции обычно основаны на объектах, а языки имеют значительный разрыв между примитивными и предметными типами. Ограниченные дженерики тоже не помогают. Тем не менее, я рекомендую сборники над массивами, если в этом нет веской причины.

Для примитивных значений вы также можете использовать библиотеку примитивных коллекций, например GNU Trove. Не знаю, есть ли что-то подобное для С#.

Ответ 8

Хорошо для одного, если вы только собираетесь обрабатывать определенный тип, вы не должны использовать ArrayList. Например, если вы ожидаете только массив байтов, вы должны принимать только массив байтов.

Только время, о котором я подумал бы, может даже подумать, что использовать ArrayList вместо List.

Ответ 9

Размер массива статический, поэтому, если вы знаете размер во время разработки, используйте массив. Предполагается, что он работает быстрее, но я сам его не тестировал. Если вам нужно часто менять количество объектов (добавление или удаление объектов из коллекции), используйте ArrayList или лучше общий список из .NET 2. Он также проще в использовании, поэтому, если производительность не имеет решающего значения, вы всегда можете использовать List.

Ответ 10

Если вам нужен массив примитивных типов, используйте Array для лучшей производительности, так как это позволит избежать автобоксинга и распаковки. Но только если вы знаете, какой размер вы хотите раньше времени.

Ответ 11

Это так.

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}