В случае Linq-to-Objects возврат List<T>
из функции не так хорош, как возврат IList<T>
, как указывает VENERABLE SKEET. Но часто вы все еще можете сделать лучше, чем это. Если вещь, которую вы возвращаете, должна быть неизменной, IList - плохой выбор, поскольку он предлагает вызывающей стороне добавлять или удалять вещи.
Например, иногда у вас есть метод или свойство, которое возвращает результат запроса Linq или использует yield return
для ленивой генерации списка, и тогда вы понимаете, что было бы лучше сделать это в первый раз, когда вы вызвано, кэшируйте результат в List<T>
и затем возвращайте кешированную версию. Вот почему возврат IList
может быть плохой идеей, потому что вызывающая сторона может изменить список для своих собственных целей, что затем повредит ваш кеш, делая их изменения видимыми для всех остальных вызывающих абонентов.
Лучше вернуть IEnumerable<T>
, поэтому все, что у них есть, это прямая итерация. И если вызывающий хочет получить быстрый произвольный доступ, т. Е. Он желает, чтобы он мог использовать [] для доступа по индексу, он может использовать ElementAt
, который определяет Linq, так что он спокойно анализирует IList
и использует это, если доступно, а если нет он делает тупой линейный поиск.
Одна вещь, которую я использовал ToList
, - это когда у меня есть сложная система выражений Linq, смешанная с пользовательскими операторами, которые используют yield return
для фильтрации или преобразования списков. Проход по отладчику может привести к путанице, так как он выполняет ленивую оценку, поэтому иногда я временно добавляю ToList () в несколько мест, чтобы мне было легче следовать пути выполнения. (Хотя если выполняемые вами вещи имеют побочные эффекты, это может изменить смысл программы.)