Подтвердить что ты не робот

Должен ли я вернуть IEnumerable или IList?

Я хочу вернуть упорядоченный список элементов из метода. Должен ли мой тип возврата быть IEnumerable или IList?

4b9b3361

Ответ 1

Здесь есть иерархия:

interface IList<T> : ICollection<T> { } 
interface ICollection<T> : IEnumerable<T> { }

Вы хотите нацелиться на наименьшую возможную связь, поэтому верните IEnumerable<T>, если этого достаточно. Это, вероятно, будет.

Возвратите IList<T>, если ситуация требует, чтобы вызывающий абонент получал список, который он может использовать для добавления/вставки/удаления. Но даже тогда было бы лучше, если бы вызывающий создал свой собственный список из коллекции IEnumerable.

Ответ 2

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

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

Ответ 3

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

Ответ 4

Как правило, лучше возвращать IEnumerable<T>, если у него есть все, что нужно вызывающему.

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

Однако, если потребителю нужны методы, которые не находятся на IEnumerable<T>, тогда IList<T> может иметь больше смысла. Например, вызывающий может захотеть вызвать Contains, который не находится на IEnumerable<T>. Или вызывающий может захотеть индексировать в список, а не повторять его от начала до конца.

Но вы можете сделать Содержит и индексирование на IEnumerable<T> тоже, через LINQ Содержит и ElementAt методы расширения. Так что здесь вопрос степени. Если вызывающему абоненту нужно задать только один вопрос, который недоступен в IEnumerable<T>, например "этот пуст", верните IEnumerable<T> и используйте Любой метод расширения. Но если вызывающий абонент использует операции IList<T> экстенсивно, верните IList<T>.

Ответ 6

IEnumerable менее специфичен, чем IList, то есть IList имеет функции, которые IEnumerable не делает.

Сравните эти два, чтобы увидеть, есть ли у вас функции, которые не нужны другим.

Ответ 7

В IList есть методы для изменения элементов (например, Add), возможно, вы хотите выбрать между ICollection и IEnumerable.

ICollection расширяет IEnumerable и имеет доступное свойство Count, которое может быть полезно.