Массив в сравнении со списком <T>: когда и что использовать? - PullRequest
544 голосов
/ 12 января 2009
MyClass[] array;
List<MyClass> list;

Каковы сценарии, когда один предпочтительнее другого? А почему?

Ответы [ 16 ]

1 голос
/ 22 августа 2014

Другая ситуация, еще не упомянутая, - это когда у одного будет большое количество элементов, каждый из которых состоит из фиксированного набора связанных, но независимых переменных, слипшихся воедино (например, координаты точки или вершины трехмерного объекта). треугольник). Массив структур с открытым полем позволит эффективно модифицировать его элементы «на месте», что невозможно при использовании любого другого типа коллекции. Поскольку массив структур хранит свои элементы последовательно в ОЗУ, последовательный доступ к элементам массива может быть очень быстрым. В ситуациях, когда код должен будет выполнить много последовательных проходов через массив, массив структур может превзойти массив или другую коллекцию ссылок на объекты класса в 2: 1; кроме того, возможность обновления элементов на месте может позволить массиву структур превзойти любой другой вид совокупности структур.

Несмотря на то, что размеры массивов не изменяются, нетрудно заставить код хранить ссылку на массив вместе с количеством используемых элементов, и при необходимости заменить массив более крупным. В качестве альтернативы можно легко написать код для типа, который ведет себя очень похоже на List<T>, но предоставляет доступ к его резервному хранилищу, позволяя, таким образом, сказать либо MyPoints.Add(nextPoint);, либо MyPoints.Items[23].X += 5;. Обратите внимание, что последний не обязательно вызовет исключение, если код попытается получить доступ за пределами списка, но в противном случае использование будет концептуально очень похоже на List<T>.

0 голосов
/ 08 января 2019

массивы Vs. Списки - это классическая проблема обслуживания и производительности. Практическое правило, которому следуют почти все разработчики, заключается в том, что вы должны использовать оба подхода, но когда они вступают в конфликт, выбирайте удобство обслуживания вместо производительности. Исключением из этого правила является ситуация, когда производительность уже оказалась проблемой. Если вы несете этот принцип в Arrays Vs. Списки, то, что вы получите, это:

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

0 голосов
/ 16 декабря 2018

Заполнить список проще, чем массив. Для массивов вам нужно знать точную длину данных, но для списков размер данных может быть любым. И вы можете преобразовать список в массив.

List<URLDTO> urls = new List<URLDTO>();

urls.Add(new URLDTO() {
    key = "wiki",
    url = "https://...",
});

urls.Add(new URLDTO()
{
    key = "url",
    url = "http://...",
});

urls.Add(new URLDTO()
{
    key = "dir",
    url = "https://...",
});

// convert a list into an array: URLDTO[]
return urls.ToArray();
0 голосов
/ 16 апреля 2018

Они могут быть непопулярны, но я фанат Arrays в игровых проектах. - Скорость итерации может быть важна в некоторых случаях, потому что foreach на массиве имеет значительно меньше накладных расходов, если вы не делаете много для каждого элемента - Добавление и удаление не так сложно с помощью вспомогательных функций - Это медленнее, но в случаях, когда вы строите его только один раз, это может не иметь значения - В большинстве случаев меньше лишней памяти тратится впустую (только очень важно для массивов структур) - Чуть меньше мусора и указателей, а погоня за указателями

При этом я использую Список гораздо чаще, чем Массивы на практике, но у каждого из них есть свое место.

Было бы неплохо, если бы в List был встроенный тип, чтобы они могли оптимизировать накладные расходы и издержки перечисления.

0 голосов
/ 29 апреля 2015

Вместо того, чтобы сравнивать характеристики каждого типа данных, я думаю, что наиболее прагматичный ответ: «Вероятно, различия не так важны для того, что вам нужно сделать, тем более что они оба реализуют IEnumerable, поэтому следуйте общепринятому соглашению и используйте List до тех пор, пока у вас не будет причины не делать этого, и в этот момент у вас, вероятно, будет причина использовать массив свыше List. "

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

0 голосов
/ 12 января 2009

Это полностью зависит от контекста, в котором требуется структура данных. Например, если вы создаете элементы, которые будут использоваться другими функциями или службами, с помощью List - это идеальный способ сделать это.

Теперь, если у вас есть список элементов, и вы просто хотите отобразить их, скажем, в массиве веб-страниц есть контейнер, который вам нужно использовать.

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