Подтвердить что ты не робот

Какая разница между строковым массивом и списком строки в С#

Я слышу MSDN, что массив быстрее, чем коллекция.

Можете ли вы сказать мне, как string[] быстрее, чем List<string>.

4b9b3361

Ответ 1

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

Однако это почти никогда не должно диктовать то, что вы на самом деле используете. Разница в производительности будет незначительной в большинстве приложений реального мира. Я редко считаю целесообразным использовать массивы, а не различные общие классы коллекций, и даже некоторые считают, что массивы несколько вредны. Один существенный недостаток заключается в том, что нет такой вещи, как неизменяемый массив (отличный от пустого)... тогда как вы можете легко открывать коллекции только для чтения через API.

Ответ 2

Статья с 2004 года, что означает ее .NET 1.1 и не было никаких дженериков. Массив против производительности коллекции фактически был проблемой тогда, потому что типы коллекций вызвали много операций по расширению бокса-распаковки. Но с .net 2.0, где были введены дженерики, разница в производительности почти ушла.

Ответ 3

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

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

Конечно, это очень упрощенное объяснение, но, надеюсь, достаточно, чтобы нарисовать картину.

Ответ 4

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

Массив, конечно, также ограничен его простотой. В первую очередь вы не можете изменить размер массива. Если вам нужна динамическая коллекция, вы должны использовать Список.

Ответ 5

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

Ответ на все быстрее зависит от того, что вы пытаетесь сделать с помощью списка/массива. Для доступа и назначения значений элементам массив, вероятно, будет пренебрежимо быстрее, поскольку List является абстракцией массива (как сказал Джон Скит).

Если вы намерены использовать структуру данных, которая растет с течением времени (получает все больше элементов), производительность (скорость передачи) будет выглядеть так, как только List начнет светиться. Это связано с тем, что каждый раз, когда вы изменяете размер массива для добавления другого элемента, это операция O (n). Когда вы добавляете элемент в список (и список уже доступен), список будет удваиваться по размеру. Я не буду вдаваться в подробные подробности, но в основном это означает, что увеличение размера списка в среднем является операцией O (log n). Конечно, у этого есть и недостатки (вы могли бы получить почти вдвое больше объема памяти, сколько вам нужно, если вы только переходите на пару предметов за последнюю емкость).

Изменить: я немного перепутал в абзаце выше. Как сказал Эрик ниже, число изменений для списка - O (log n), но фактические затраты, связанные с изменением размера массива, амортизируются до O (1).

Ответ 6

Массив - это смежная область памяти в ОЗУ. Список может быть создан с помощью массива или путем расчесывания элементов списка с помощью ссылок. Доступ к элементам памяти в непрерывной памяти происходит быстрее, чем доступ к элементам списков, ускоряющих разные места в памяти.