Какая разница между IEnumerable и Array, IList и List?

Какая разница между IEnumerable и Array?

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

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

Ответ 1

IEnumerable предоставляет только минимальную "итерируемую" функциональность. Вы можете пройти последовательность, но об этом. Это имеет недостатки - например, очень неэффективно считать элементы с помощью IEnumerable или получить n-й элемент - но у него также есть преимущества - например, IEnumerable может быть бесконечной последовательностью, такой как последовательность простых чисел.

Array представляет собой коллекцию фиксированного размера со случайным доступом (т.е. вы можете индексировать ее).

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

IList - это интерфейс, который абстрагирует функциональность списка (количество, добавление, удаление, доступ индексатора) от различных конкретных классов, таких как List, BindingList, ObservableCollection и т.д.

Ответ 2

IEnumerable - это интерфейс, который позволяет итерации через набор элементов (например, через ключевое слово foreach).

Массив является встроенным .NET. Он содержит элементы того же типа, но имеет фиксированный размер. Когда вы создадите массив с x элементами, он не может расти или сокращаться.

IList определяет интерфейс для списка, а также реализует IEnumerable.

Список реализует интерфейс IList; это конкретный тип списка.

Разница между .NET-списками и массивами состоит в том, что в списки могут добавляться элементы, которые они увеличивают, чтобы они были достаточно большими, чтобы содержать все необходимые элементы. Список хранит это внутренне в массиве и, когда массив уже не является достаточно большим для хранения всех элементов, создается новый массив и элементы, скопированные в.

IList и массивы реализуют IEnumerable. То, как интерфейсы работают - классы реализуют контракт и ведут себя аналогичным образом и могут рассматриваться аналогично как результат (вы знаете, что класс реализует IEnumerable, вам не нужно знать хау или whys). Я предлагаю вам ознакомиться с интерфейсами и т.д.

Ответ 3

IEnumerable и IList интерфейсы. Массив и список - это классы. Массив реализует IEnumerable. Список реализует IList, который расширяет IEnumerable.

Изменить: как упоминается в комментариях itowlson, Array также реализует IList.

Ответ 4

Генерация коллекции IEnumerable является ленивой. Пример:

public IEnumerable<int> GetTwoInts()
{
  yield return 1;
  yield return 2;
}
public void Something()
{
  var twoInts = GetTwoInts();
}

В методе Something вызов GetTwoInts() фактически не приведет к запуску метода GetTwoInts, поскольку перечисление никогда не повторяется.

Ответ 5

IEnumerable - это универсальный интерфейс, который используется многими классами, такими как Array, List и String, чтобы позволить кому-то перебирать коллекцию. В принципе, это то, что приводит в действие оператор foreach.

IList, как правило, выставляете переменным типа List конечным пользователям. Этот интерфейс позволяет осуществлять произвольный доступ к основной коллекции.

Ответ 6

Это старый пост, но он все еще думал ответить. IEnumerable - это поведение, в то время как Array - это структура данных (непрерывный набор элементов с фиксированным размером, облегчающий доступ к элементам по индексам). Когда Array реализует IEnumerable, он должен также отображать свойство ennumerable inherent (упрощение итерации по коллекции).

Ответ 7

В дополнение к другим ответам обратите внимание, что при выполнении инструкции foreach существует различие производительности между IList<T> и List<T>.

Это потому, что объект-итератор, возвращаемый List<T>.GetEnumerator, является значением типа, тогда как возвращаемый IList<T>.GetEnumerator является ссылочным типом и, следовательно, требует выделения памяти (см. Перечислитель типа значения списка в С#).

По-моему, IList<T> не очень хороший интерфейс. Например, вызов Add может вызывать (см. Почему массив реализует IList?). Если вам нужна инкапсуляция, вам лучше использовать IEnumerable<T> или IReadOnlyList<T>.