2010-03-12 1 views
31

я в основном хочу знать различие или преимущества в использовании общего списка вместо массива в указанном ниже сценарииC# массив против общего списка

class Employee 
{ 
    private string _empName; 

    public string EmpName 
    { 
     get{ return _empName; } 
     set{ _empName = value; } 
    } 
} 

1. Employee[] emp 
2. List<Employee> emp 

может кто-нибудь пожалуйста, скажите мне преимущества или недостатки, и какой из них предпочтительнее?

+9

Ваш класс будет более чистым, если вы использовали автоматически реализованные свойства: public string EmployeeName {get; задавать;}. Использование полных имен, таких как EmployeeName, также поможет. О, а как насчет некоторых типов тоже? :-) –

ответ

19

Большая разница заключается в том, что List<Employee> можно развернуть (вы можете позвонить «Добавить на него») или сжиматься (вы можете вызвать «Удалить»), тогда как Employee [] фиксирован в размере. Таким образом, Employee[] сложнее работать, если это не требует необходимости.

+1

Плюс с библиотеками LINQ, вы всегда можете вызвать List.ToArray(), если в какой-то момент вы будете НУЖНЫ в массиве, поэтому List действительно дает вам максимальную мощность и гибкость. – eidylon

+3

ToArray() - это встроенный метод объекта List, который предшествует LINQ. LINQ добавляет аналогичный метод в IEnumerables. –

1

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

1

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

2

Вам нужно знать размер массива в то время, когда он создан, но после его создания вы не можете изменить его размер.

Таким образом, он использует динамическое распределение памяти для массива во время создания. (Это отличается от статического распределения памяти, которая используется для массивов C++, где размер должен быть известен во время компиляции.)

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

-from MSDN

  1. Generics Vs Array Lists-SO Общие Comparision.
  2. Generic List vs Arrays-SO Почему общий список медленнее массива?

Какой предпочитаете? List<T>.

7

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

Как правило, предпочитайте списки, если вы не знаете ваши данные никогда не меняют размер.

API-мудрый, поскольку LINQ там мало что выбрать между ними (то есть дополнительные методы на List<T> в значительной степени дублируются LINQ, поэтому массивы получают их бесплатно).

Еще одно преимущество заключается в том, что список не нужно подвергать сеттер:

private readonly List<Foo> items = new List<Foo>(); 
public List<Foo> Items { get { return items; } } 

устранив ряд null ошибок, и позволяет сохранить контроль над данными (особенно, если вы используете другая реализация IList<>, которая поддерживает проверку/проверку при изменении содержимого).

12

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

Мне нравится Список, если нет веской причины использовать Array, поскольку гибкость List хороша, а штраф в исполнении очень мал относительно стоимости большинства других вещей, которые обычно выполняет ваш код.

Если вы хотите погрузиться во множество интересных технических деталей, ознакомьтесь с this StackOverflow thread, который углубляется в вопрос «Список против массива» более подробно.

+6

Это не делает их неизменными; вы все равно можете поменять содержимое. Это просто делает их фиксированными. –

+0

Erk, хороший момент Mark. Неправильно использовал термин неизменный. Теперь изменилось. Кстати, я вижу, вы уже ответили на это ... Я добавил ссылку на ваш ответ выше. :-) –

+0

+1 для связи с другой веткой – Danvil

2

Если вы публикуете коллекцию в открытом интерфейсе, рекомендации .NET Framework рекомендуют использовать List, а не T []. (Фактически, BindingList < T>)

Внутренне массив может быть более уместным, если у вас есть коллекция, которая является фиксированным, известным размером. Изменение размера массива дорого по сравнению с добавлением элемента в конец списка.

 Смежные вопросы

  • Нет связанных вопросов^_^