Что лучше использовать массив или List <>?

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

Например, у меня есть список строк, не зная, сколько элементов мне нужно, так что функция .Add(String) действительно удобна. Я могу легко добавлять новые строки в список в любое время.

Каковы преимущества/недостатки использования каждого?

Перечисляет ли новые массивы?

Ответ 1

Для правильного ответа на вопрос необходимо больше контекста:

В общедоступном API вы должны попытаться использовать абстрактные типы коллекций, чтобы впоследствии можно было изменить внутреннюю реализацию, если вам нужно.

  • Если коллекция не должна изменяться внешним миром, используйте IEnumerable<T>.
  • Если коллекция будет изменена внешним миром, используйте ICollection<T>.
  • Если требуется индексированный доступ, используйте IList<T>.

В частной реализации не так важно использовать абстрактные типы:

  • Если вам нужен индексированный доступ и узнать конечный размер, используйте T[] или List<T>.
  • Если вам нужен индексированный доступ и не знаете конечный размер, используйте List<T>.
  • Если вы планируете обращаться к элементам в шаблоне LIFO, используйте Stack<T>.
  • Если вы планируете обращаться к элементам в шаблоне FIFO, используйте Queue<T>.
  • Если вам нужно получить доступ к элементам в начале и конце списка, но не посередине, используйте LinkedList<T>.
  • Если вы не хотите дублировать, используйте HashSet<T>.

В .NET 4.0 у вас есть еще несколько вариантов, но это основы.

Ответ 2

List<String> реализуется с использованием массива String[].

Если вы не знаете, сколько у вас элементов, используйте List<String>

Вы можете указать оценочное (или максимальное) количество элементов, которые вы ожидаете в параметре конструктора емкости (new List<String>(10)), это будет начальный размер базового массива.

Когда вы Add() элемент и нет места для этого элемента, базовый массив копируется в новый массив с двойным размером.

Что я делаю: когда я знаю точный размер коллекции, и я знаю, что не изменю размер коллекции, я использую массив (String[]). В противном случае я использую List<String>.

Кстати, это относится к любому типу, а не только к String.

Ответ 3

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

Ответ 4

Используйте List < > в большинстве случаев, и не беспокойтесь о производительности. Существует хороший шанс, что вы пройдете всю свою карьеру и никогда не нуждаетесь в настройке производительности, преобразовывая List < > в массив.

Ответ 5

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

Ответ 6

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

Ответ 7

Если вам нужен динамический размер, перейдите к List<string>.

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

Если у вас есть коллекция с установленным размером, вы все равно можете использовать string[].

Ответ 8

Конечно, это зависит от вашего приложения, но в обстоятельствах List<string> (или даже просто IEnumerable<string> предпочтительнее.