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

Кто-нибудь опишет IEnumerable и в чем разница между IEnumerable и массивом? и где его использовать .. вся информация о нем и как его использовать.

8
задан Nishant Kumar 8 September 2010 в 06:39
поделиться

5 ответов

Массив представляет собой набор объектов заданного размера.

int[] array = [0, 1, 2];

Это делает его очень полезным в ситуациях, когда вам может понадобиться получить доступ к элементу в определенном месте в коллекции, поскольку расположение в памяти каждого элемента уже известно.

array[1];

Кроме того, размер массива можно вычислить быстро. .

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

public IEnumerable<int> Infinite()
{
    int i = 0;
    while(true)
        yield return i++;
}

В отличие от массива, перечисляемая коллекция может быть любого размера, и можно создавать элементы по мере необходимости, а не заранее, это позволяет создавать мощные конструкции и используется широко используется LINQ для облегчения сложных запросов.

//This line won't do anything until you actually enumerate the created variable
IEnumerable<int> firstTenOddNumbers = Infinite().Where(x => x % 2 == 1).Take(10);

Однако единственный способ получить конкретный элемент — это начать с самого начала и перейти к нужному элементу. Это будет значительно дороже, чем получение элемента из предварительно сгенерированного массива.

Конечно, вы можете перечислять через массив, поэтому массив реализует интерфейс IEnumerable.

11
ответ дан 5 December 2019 в 08:50
поделиться

Массивы

Массив .Net представляет собой набор нескольких значений, последовательно хранящихся в памяти. К отдельным элементам в массиве можно получить произвольный доступ по индексу (и это довольно эффективно).Важными членами массива являются:

  • этот[Int32 index] (оператор индексации)
  • длина

C# имеет встроенную поддержку массивов, и их можно инициализировать непосредственно из кода:

var array = new[] { 1, 2, 3, 4 };

массивы также может быть многомерным и реализовывать несколько интерфейсов, включая IEnumerable (где T — тип элемента массива).

IEnumerable

Интерфейс IEnumerable определяет метод GetEnumerator(), но этот метод редко используется напрямую. Вместо этого для итерации по перечислению используется цикл foreach:

IEnumerable<T> enumerable = ...;
foreach (T element in enumerable)
  ...

Если перечисление выполняется для массива или списка, все элементы перечисления существуют во время перечисления, но также возможно перечисление элементов которые создаются на лету. Для этого очень полезна конструкция yield return.

Можно создать массив из перечисления:

var array = enumerable.ToArray();

Это позволит получить все элементы из перечисления и сохранить их последовательно в одном массиве.

Подводя итог:

  • Массивы — это набор элементов, к которым можно получить произвольный доступ по индексу
  • Перечисления — это абстракция над набором элементов, к которым можно получить доступ один за другим в прямом порядке
2
ответ дан 5 December 2019 в 08:50
поделиться

Массив — это набор данных. Подразумевается, что элементы хранятся непрерывно и могут быть добавлены напрямую.

IEnumerable — это описание набора данных. Сами по себе они не коллекции. В частности, это означает, что коллекцию можно проходить по одному элементу за раз.

ЕСЛИ вы определяете переменную как тип IEnumerable, то она может ссылаться на коллекцию любого типа, который соответствует этому описанию.

Массивы перечислимы. Так же как и списки, словари, наборы и другие типы коллекций. Кроме того, вещи, которые не кажутся коллекцией, могут быть Enumerable, например, строка (то есть IEnumerable) или объект, возвращаемый Enumerable.Range(). ], который генерирует новый элемент для каждого шага, фактически нигде его не удерживая.

2
ответ дан 5 December 2019 в 08:50
поделиться

Во-первых, массивы обеспечивают произвольный доступ к некоторому содержимому фиксированного размера. Где интерфейс IEnumerable предоставляет данные последовательно, которые вы можете извлекать из IEnumerable по одному, пока источник данных не будет исчерпан.

1
ответ дан 5 December 2019 в 08:50
поделиться

.NET неправильно назвал интерфейс IEnumerable — он должен быть IIterable. По сути, System.Collection.IEnumerable или (начиная с дженериков) System.Collection.Generic.IEnumerable позволяет использовать foreach для объекта, реализующего эти интерфейсы.

(Примечание: на самом деле .NET использует утиную типизацию для foreach, поэтому вам не требуется реализовывать эти интерфейсы — достаточно предоставить подходящие реализации методов.)

Массив (System.Array) — это тип последовательности (где под последовательностью я подразумеваю итерируемую структуру данных, то есть все, что реализует IEnumerable), с некоторыми важными отличиями.

Например, IEnumerable может быть — и часто — отложенной загрузкой. Это означает, что пока вы явно не повторите его, элементы не будут созданы. Это может привести к странному поведению, если вы об этом не знаете. Как следствие, IEnumerable не может сообщить вам, сколько элементов он содержит, пока вы фактически не выполните итерацию по нему (что делает метод расширения Count в классе System.Linq.Enumerable).

У массива есть свойство «Длина», и с этим мы подошли к самому важному отличию: массив представляет собой последовательность фиксированных (и известных) элементов. Он также предоставляет индексатор, поэтому вы можете удобно получать доступ к его элементам, фактически не перебирая их.

Для справки: «настоящие» перечисления в .NET — это типы, определенные с помощью ключевого слова enum. Они позволяют вам выражать выбор без использования магических чисел или строк. Их также можно использовать в качестве флагов, если они помечены атрибутом FlagsAttribute.

Я предлагаю вам использовать вашу любимую поисковую систему, чтобы получить более подробную информацию об этих концепциях — мой краткий обзор явно не ставит своей целью дать глубокое понимание этих функций.

3
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: