В чем разница между T [] и List <T>? - PullRequest
0 голосов
/ 04 марта 2011

На самом деле я всегда использую общие коллекции и часто использую список <>.В некоторых сценариях я думаю, что new List<string>() очень уродлив, и я предпочитаю использовать string[], но я не использую его, потому что, насколько я знаю, Generics имеет лучшую производительность, и поэтому я использую их.

Является ли строка [], int [] или какой-либо не универсальный массив вредным для приложения?

Я просто хочу знать, в чем на самом деле разница, влияние между массивами и универсальными коллекциями.

edit:

давайте подделаем сценарий

Я должен вызвать этот метод, должен ли я использовать string[] или List<string>?Что лучше?

static void PrintValues(IEnumerable<string> values) {
    foreach(var value in values) {
        Console.WriteLine(value);
    }
}

Ответы [ 5 ]

6 голосов
/ 04 марта 2011

Основным отличием является то, что вы можете добавлять новые элементы в List<T>.

Внутренне List<T> сохраняет элементы в массиве типа T[], и он просто автоматически выделяет больший массив при добавлении новых элементов (или уменьшает массив при удалении элементов). Это означает, что производительность будет примерно одинаковой. При использовании List<T> наблюдается незначительное косвенное отклонение, но JITter может указывать на это.

Основная причина использования List<T> заключается в том, что он дает вам больше функциональности - вы можете добавлять и удалять элементы.

РЕДАКТИРОВАТЬ В вашем примере с PrintValues это не имеет большого значения. Это зависит от источника данных. Если вы просто хотите вызвать его с некоторыми фиксированными аргументами, вы можете использовать массивы, потому что их проще создавать, например, new [] { "hello", "world" }.

В большинстве реальных сценариев вы будете читать данные откуда-то - если вы можете получить все данные одновременно, то вы можете использовать массивы. Если вы будете читать их один за другим, вы будете использовать List<string>, чтобы вы могли добавлять элементы по мере их чтения.

3 голосов
/ 04 марта 2011

Чтобы ответить на ваш отредактированный вопрос, ответ: это не имеет значения для функции PrintValues.Он будет просто повторяться.

Что имеет значение, так это код, который вызывает эту функцию - как он получил значения для печати?Если это довольно статичный список значений, то использование массива будет более эффективным.Если коллекция должна быть построена или иным образом манипулирована, тогда List<T> (или Stack<T> или что-то еще) может быть лучше.

Если вы используете LINQ, у вас будет больше шансов использовать IEnumerable<T> и не важно, какой тип на самом деле реализует этот интерфейс.

2 голосов
/ 04 марта 2011

List<T> - это, по сути, оболочка массива T[] с дополнительными методами и неявной реализацией IList<T>.

Также typeof(T[]).IsAssignableFrom(typeof(IList<T>)) == true.

Мне кажется, что производительность массива будет лучше, чем производительность списка, потому что все, что делает список, делает что-то с массивом, а массив просто делает что-то для себя.

1 голос
/ 04 марта 2011

У меня всегда есть это, чтобы выбрать между этими двумя, и я добавлю вам новый.

  • Массив: я использую его только для доступа только для чтения, потому что произвольный доступ является прямым.
  • ArrayList: при необходимости использует массив, растущий изнутри, поэтому он имеет преимущество простого произвольного доступа, но если массив заполнен при вставке, он должен выделить новый и скопировать все элементы.
  • LinkedList: действительно хорош для вставки, его следует избегать, если вы хотите произвольный доступ, потому что он должен проходить через все элементы до запрошенного.
0 голосов
/ 04 марта 2011

Массив - это структура примитивного языка.Это означает, что теоретически они более эффективны.С другой стороны, они будут иметь меньше возможностей, разрешать нежелательные операции, не иметь интерфейсов, нескольких реализаций с интересными свойствами ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...