Я должен возвратить IEnumerable или IList? [закрытый]

38
задан Winston Smith 5 July 2010 в 15:54
поделиться

7 ответов

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

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

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

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

42
ответ дан 27 November 2019 в 03:34
поделиться

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

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

2
ответ дан 27 November 2019 в 03:34
поделиться

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

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

13
ответ дан 27 November 2019 в 03:34
поделиться

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

5
ответ дан 27 November 2019 в 03:34
поделиться

Вообще, лучше возвращать IEnumerable, если в нем есть все, что нужно вызывающей стороне.

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

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

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

4
ответ дан 27 November 2019 в 03:34
поделиться

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

http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

Вы можете связать заказ с объектами.

3
ответ дан 27 November 2019 в 03:34
поделиться

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

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

2
ответ дан 27 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

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