Здесь существует иерархия:
interface IList<T> : ICollection<T> { }
interface ICollection<T> : IEnumerable<T> { }
Вы хотите стремиться к наименьшей возможной связи, поэтому верните IEnumerable
, если этого достаточно. Вероятно, так и будет.
Вернуть IList
, если ситуация требует, чтобы вызывающий абонент получил список, который он может использовать для добавления / вставки / удаления. Но даже в этом случае было бы лучше, если бы вызывающий объект создал свой собственный список из коллекции IEnumerable.
В списке IList есть методы для изменения элементов (например, Добавить), возможно, вы хотите выбрать между ICollection и IEnumerable.
ICollection расширяет IEnumerable и имеет свойство Count, которое может быть полезно.
Это зависит от того, что вы хотите сделать с результатом. Если вам нужно получить количество элементов или произвольный доступ к отдельным элементам, используйте IList.
Если вызывающие стороны хотят просто перебирать элементы, используйте IEnumerable - но вы должны документировать, будет ли возвращаемое значение оцениваться лениво или нет - многие экземпляры IEnumerable в наши дни представляют запросы, которые будут выполняться, когда коллекция будет перечислена. Чтобы подстраховаться, если возвращаемое значение не будет оцениваться по требованию, я бы выбрал IList.
Это просто, если вызывающий должен использовать его только для чтения, используйте IEnumerable. так как это тогда также поддерживает ковариацию (результат может быть приведен к базовому типу)
Вообще, лучше возвращать IEnumerable
, если в нем есть все, что нужно вызывающей стороне.
IEnumerable
является foreachable, что является всем необходимым для многих потребителей. Он также доступен только для чтения, что часто хорошо - это означает, что вы можете иногда оптимизировать, возвращая вашу фактическую коллекцию заднего плана, не слишком беспокоясь о том, что кто-то изменит ее, не предупредив вас.
Однако, если потребителю нужны методы, которых нет в IEnumerable
, то IList
может иметь больше смысла. Например, вызывающий может захотеть вызвать Contains
, которого нет в IEnumerable
. Или вызывающая сторона может захотеть индексировать список, а не итерировать его от начала до конца.
Но вы можете делать Contains и индексирование и на IEnumerable
, используя методы расширения LINQ Contains и ElementAt. Так что здесь возникает вопрос степени. Если вызывающей стороне нужно задать только один вопрос, недоступный для IEnumerable
, например, "пусто ли здесь", то верните IEnumerable
и используйте метод расширения Any. Но если вызывающая сторона широко использует операции IList
, возвращайте IList
.
Если вы хотите вернуть упорядоченный список, возможно, вам следует вернуть SortedList.
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
Вы можете связать заказ с объектами.
IEnumerable менее специфичен, чем IList, то есть IList имеет функции, которых нет в IEnumerable.
Сравните два, чтобы увидеть, есть ли у одного функции, которые вам нужны, а у другого нет.