В чем разница между IEnumerable и Array, IList и List?


В чем разница между IEnumerable и Array?

В чем разница между IList и List?

они, кажется, имеют ту же функцию.

7 81
c#

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>.