Я хочу вернуть упорядоченный список элементов из метода. Должен ли мой тип возврата быть IEnumerable или IList?
Должен ли я вернуть IEnumerable или IList?
Ответ 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>
.
Ответ 5
Если вы хотите вернуть упорядоченный список, возможно, вы должны вернуть SortedList.
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
Вы можете связать заказ с объектами.
Ответ 6
IEnumerable менее специфичен, чем IList, то есть IList имеет функции, которые IEnumerable не делает.
Сравните эти два, чтобы увидеть, есть ли у вас функции, которые не нужны другим.
Ответ 7
В IList есть методы для изменения элементов (например, Add), возможно, вы хотите выбрать между ICollection и IEnumerable.
ICollection расширяет IEnumerable и имеет доступное свойство Count, которое может быть полезно.