В чем разница между 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>
.