В чем разница между массивом строк и списком строк в C # - PullRequest
42 голосов
/ 25 апреля 2011

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

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

Ответы [ 5 ]

50 голосов
/ 25 апреля 2011

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

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

9 голосов
/ 25 апреля 2011

Статья написана в 2004 году, это означает, что речь идет о .net 1.1 , и дженериков не было. Производительность массива и коллекции на самом деле была проблемой в то время, потому что типы коллекций вызывали много операций exta boxing-unboxing. Но начиная с .net 2.0, где были представлены дженерики, разница в производительности почти исчезла.

6 голосов
/ 25 апреля 2011

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

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

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

3 голосов
/ 25 апреля 2011

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

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

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

Редактировать: я немного запутался в параграфе выше. Как сказал Эрик ниже, количество измененных размеров для List равно O (log n), но фактическая стоимость, связанная с изменением размера массива, амортизируется до O (1).

3 голосов
/ 25 апреля 2011

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

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

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