Кто-то может сказать мне, в чем разница между List, Collection и Enumerable? - PullRequest
2 голосов
/ 21 декабря 2011

Пока я делаю программу, иногда у меня возникают сомнения. Я использовал List<T>, но я не использовал другие.

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

Ответы [ 4 ]

6 голосов
/ 21 декабря 2011

Я уверен, что вы можете прочитать документацию самостоятельно. Я дам краткое резюме здесь:

  1. IEnumerable - это интерфейс, который предоставляет перечислителю коллекцию. Реализуйте этот интерфейс, если хотите иметь возможность поддерживать итерации, например, внутри цикла foreach.
  2. Collection - это реализация IEnumerable (поэтому вы можете выполнять итерации по ней), которая обычно дополнительно расширяется пользовательскими классами, которые хотят иметь поведение, похожее на коллекцию (т. Е. Использовать Add, Remove, Contains и т. Д.). Его также можно использовать «как есть».
  3. List также является реализацией IEnumerable (поэтому вы можете перебирать ее), которая обычно используется "как есть" в качестве контейнера для объектов определенного типа. Использует динамически настраиваемый массив в фоновом режиме и является общим эквивалентом ArrayList.

Обратите внимание, что хотя IEnumerable может быть как универсальным, так и не универсальным, Collection и List могут использоваться только как универсальные классы.

1 голос
/ 21 декабря 2011

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

ICollection / CollectionBase и IEnumerable не являются непосредственно инстанцируемыми типами.

CollectionBase / ICollection - это базовый класс / интерфейс, который наследуется / реализуется любым классом, который считает себя коллекцией и содержит несколько элементов. CollectionBase / ICollection также позволяет передавать коллекции, не зная их реализации.

IEnumerable также является интерфейсом, который предоставляет методы для перебора коллекции. IEnumerable в основном позволяет использовать циклы foreach в коллекции. Вы можете напрямую использовать методы интерфейса для запуска некоторых итераторов в стиле C ++, но цикл foreach менее подвержен ошибкам.

1 голос
/ 21 декабря 2011
0 голосов
/ 21 декабря 2011

Если вы посмотрите на определения трех (см. Ниже), вы заметите, что List реализует Enumerable и ICollection, а ICollection реализует IEnumerable. Более четко:

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

ICollection - это интерфейс, который определяет общий способ управления коллекциями. ПРИМЕЧАНИЕ: это интерфейс и, следовательно, он НЕ может быть создан.

IEnumerable - это интерфейс, который определяет способ перебора коллекции. ПРИМЕЧАНИЕ: это интерфейс и, следовательно, он НЕ может быть создан.

Список

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

public class List<T> : IList<T>, ICollection<T>, 
IEnumerable<T>, IList, ICollection, IEnumerable

ICollection

Определяет методы для управления общими коллекциями.

public interface ICollection<T> : IEnumerable<T>, 
IEnumerable

IEnumerable

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

public interface IEnumerable<out T> : IEnumerable
...