Что мне следует использовать IEnumerable или IList?

Может ли кто-нибудь сказать мне, когда я должен использовать то же самое.

Например, я думаю, что мне следует использовать IList, когда я хочу получить доступ к .Count коллекции или отдельному элементу, правильно?

Спасибо.


person Sergio Tapia    schedule 12.07.2010    source источник


Ответы (3)


В общем, вы должны попробовать использовать наименее конкретный тип, который подходит для ваших целей. IEnumerable менее конкретен, чем IList (IList реализует IEnumerable), поэтому, если вы не хотите что-то конкретное от IList (например, Count, как вы предлагаете, или, возможно, Add, Delete и т. Д.), Я бы использовал IEnumerable.

Одним из преимуществ использования IEnumerable является то, что вы можете написать методы итератора для возврата этого типа (ищите "yield return" и методы итератора, если вы не знакомы с ними). Это позволяет вам писать очень эффективные с точки зрения памяти "конвейеры" для ваших циклов.

person Rob Levine    schedule 12.07.2010
comment
Я согласен с использованием наименее производного типа. ICollection ‹› достаточно для большинства операций добавления / удаления. - person Mark H; 12.07.2010
comment
@Mark H - хороший момент - для большинства операций добавления / удаления даже IList излишне специфичен. - person Rob Levine; 12.07.2010
comment
IList реализует IEnumerable ?! - person Yehuda Shapira; 08.04.2013
comment
Да: IList реализует IEnumerble: msdn.microsoft.com/en -us / library / system.collections.ilist.aspx. В конце концов, список - это перечислимый набор вещей, которые можно повторять. - person Rob Levine; 10.04.2013
comment
Я думаю, что в конечном итоге это действительно зависит от того, какой набор функций / методов вы хотите предоставить потребителям вашего класса. Сказать, что мы должны попытаться использовать наименее конкретный тип, по крайней мере, неверно. Люди спросят: почему бы нам не использовать объект все время, поскольку объект является наименее производным типом? - person Stack0verflow; 18.03.2016
comment
Я думаю, вы неправильно поняли суть дела. Я не предлагаю вам всегда использовать точку с наименее производным типом. Вы используете наименее конкретный тип , который соответствует вашим целям и имеет необходимые вам методы и свойства. Так, например, system.object был бы хорошим выбором, если бы все, что вы делали, - это доступ к типу объекта через GetType, но это бесполезно, если вы ожидаете, что это будет список элементов. Если вы ожидаете список элементов, но хотите только перечислить их, IEnumerable будет лучшим выбором, но не годится, если вы хотите добавить в список, и в этом случае IList - лучший выбор. - person Rob Levine; 19.03.2016
comment
Одним из преимуществ IEnumerable является то, что его нельзя изменить (если вы хотите использовать более функциональный стиль программирования). - person Endy Tjahjono; 15.01.2019

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

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

IList против IEnumerable для коллекций по сущностям

http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=722

person kemiller2002    schedule 12.07.2010
comment
У меня проблема с этим ответом. Вы хотите использовать IList при многократном повторении коллекции. В противном случае вы получите несколько ненужных перечислений - person JSON; 20.04.2021

Вы должны использовать IList, когда вам нужен доступ по индексу к вашей коллекции, добавлению и удалению элементов и т. Д., И IEnumerable, когда вам нужно просто перечислить вашу коллекцию.

Очень простой ответ, я могу его расширить, если вы опишете сценарий.

person Restuta    schedule 12.07.2010