Что лучше использовать массив или 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>
предпочтительнее.