В C # есть три концепции для представления пакета объектов. В порядке увеличения возможностей, они:
- Перечислимый - неупорядоченный, неизменяемый
- Коллекция - можно добавлять / удалять элементы
- Список - позволяет элементам иметь заказ (доступ и удаление по индексу)
Enumerable не имеет порядка. Вы не можете добавлять или удалять элементы из набора. Вы даже не можете получить количество предметов в наборе. Он строго позволяет получить доступ к каждому элементу в наборе, один за другим.
Коллекция - модифицируемый набор. Вы можете добавлять и удалять объекты из набора, вы также можете получить количество элементов в наборе. Но по-прежнему нет порядка, и потому что нет порядка: нет способа получить доступ к элементу по индексу, и нет никакого способа сортировки.
Список - упорядоченный набор объектов. Вы можете отсортировать список, получить доступ к элементам по индексу, удалить элементы по индексу.
На самом деле, глядя на интерфейсы для них, они основываются друг на друге:
При объявлении переменных или параметров метода вы должны выбрать
- IEnumerable
- ICollection
- IList
на основе концептуально вам нужно сделать с набором объектов.
Если вам просто нужно что-то сделать для каждого объекта в списке, тогда вам нужно только IEnumerable
:
void SaveEveryUser(IEnumerable<User> users)
{
for User u in users
...
}
Вам все равно, хранятся ли пользователи в List<T>
, Collection<T>
, Array<T>
или чем-либо еще. Вам нужен только интерфейс IEnumerable<T>
.
Если вам нужно иметь возможность добавлять, удалять или считать элементы в наборе, тогда используйте Коллекция :
ICollection<User> users = new Collection<User>();
users.Add(new User());
Если вы заботитесь о порядке сортировки и хотите, чтобы он был правильным, используйте Список :
IList<User> users = FetchUsers(db);
В форме диаграммы:
| Feature | IEnumerable<T> | ICollection<T> | IList<T> |
|------------------------|----------------|----------------|----------|
| Enumerating items | X | X | X |
| | | | |
| Adding items | | X | X |
| Removing items | | X | X |
| Count of items | | X | X |
| | | | |
| Accessing by index | | | X |
| Removing by indexx | | | X |
| Getting index of item | | | X |
List<T>
и Collection<T>
в System.Collections.Generic
- это два класса, которые реализуют эти интерфейсы; но они не единственные классы:
ConcurrentBag<T>
- это заказанная сумка с предметами (IEnumerable<T>
)
LinkedList<T>
- сумка, к которой у вас нет доступа к предметам по индексу (ICollection
); но вы можете произвольно добавлять и удалять элементы из коллекции
SynchronizedCollection<T>
в упорядоченной коллекции, где вы можете добавлять / удалять элементы по индексу
Так что вы можете легко изменить:
IEnumerable<User> users = new SynchronizedCollection<User>();
SaveEveryUser(users);
ТЛ; др
- Перечислимый - доступ к элементам, неупорядоченный, неизменяемый
- Коллекция - можно изменить (добавить, удалить, сосчитать)
- Список - доступ по индексу
Выберите концепт , который вам нужен, затем используйте соответствующий класс.