В чем разница между IEnumerable и Array, IList и List?
В чем разница между IEnumerable и Array?
В чем разница между IList и List?
они, кажется, имеют ту же функцию.
7 ответов:
IEnumerable обеспечивает только минимальную" итерационную " функциональность. Вы можете пересечь последовательность, но это все. Это имеет недостатки - например, очень неэффективно подсчитывать элементы с помощью IEnumerable или получать N-й элемент-но у него есть и преимущества-например, IEnumerable может быть бесконечной последовательностью, такой как последовательность простых чисел.
массив представляет собой коллекцию фиксированного размера с произвольным доступом (т. е. вы можете индексировать в нее).
список a коллекция переменного размера (т. е. вы можете добавлять и удалять элементы) с произвольным доступом.
IList-это интерфейс, который абстрагирует функциональность списка (count, add, remove, indexer access) от различных конкретных классов, таких как List, BindingList, ObservableCollection и т. д.
IEnumerable-это интерфейс, который позволяет выполнять итерацию через коллекцию элементов (например, через ключевое слово foreach).
массив является встроенным .NET. Он содержит элементы одного типа, но имеет фиксированный размер. После создания массива с X элементами он не может расти или сжиматься.
IList определяет интерфейс для списка, а также реализует IEnumerable.
List реализует интерфейс IList; это конкретный тип список.
разница между списками .NET и массивами заключается в том, что в списки могут быть добавлены элементы-они становятся достаточно большими, чтобы содержать все необходимые элементы. Список магазинов этого внутри массива и, когда массив больше не достаточно большой, чтобы вместить все элементы, создается новый массив и элементы дублируются.
IList & массивы оба реализуют IEnumerable. Вот как работают интерфейсы -- классы реализуют контракт и ведут себя аналогично мода и может рассматриваться как результат (вы знаете, что класс реализует интерфейс IEnumerable, вам не нужно знать как и почему). Я предлагаю вам прочитать на интерфейсах и так далее.
IEnumerable и IList являются интерфейсы. Массив и список-это классы. Массив реализует IEnumerable. Список реализует IList, который расширяет IEnumerable.
Edit: как itowlson упоминалось в комментарии, Array также реализует IList.
генерация коллекции IEnumerable является ленивой. Пример:
public IEnumerable<int> GetTwoInts() { yield return 1; yield return 2; } public void Something() { var twoInts = GetTwoInts(); }в методе что-то вызов GetTwoInts() фактически не приведет к выполнению метода GetTwoInts, поскольку перечисление никогда не повторяется.
IEnumerable- Это универсальный интерфейс, который используется многими классами, напримерArray,ListиStringчтобы позволить кому-то перебирать коллекцию. В принципе, это то, что управляетforeachзаявление.
IListобычно как вы выставляете переменные типаListдля конечных пользователей. Этот интерфейс позволяет произвольный доступ к базовой коллекции.
Это старый пост, но все еще думал, что ответить. IEnumerable-это поведение, в то время как Array-это структура данных(непрерывная коллекция элементов с фиксированным размером, облегчающая доступ к элементам по индексам) . Когда массив реализует IEnumerable, он должен также отображать присущее IEnumerable свойство (облегчающее итерацию по коллекции).
чтобы дополнить другие ответы, обратите внимание, что есть разница в производительности между
IList<T>иList<T>при выполнении оператора foreach.это потому, что объект iterator, возвращенный
List<T>.GetEnumerator- Это тип значения, тогда как тот, который возвращаетсяIList<T>.GetEnumeratorявляется ссылочным типом и поэтому требует выделения памяти (см. перечислитель типа значения списка в c#).по-моему,
IList<T>не очень хороший интерфейс. Например, вызовAddмогу кинуть (см. почему массив реализует IList?). Если вам нужна инкапсуляция вам лучше использоватьIEnumerable<T>илиIReadOnlyList<T>.