В случае с Linq-to-Objects возврат List<T>
от функции не так хорош, как возвращение IList<T>
, так как указывает ВОЗМОЖНЫЙ СКОРОСТЬ. Но часто вы все еще можете сделать лучше. Если вещь, которую вы возвращаете, должна быть неизменной, IList - это плохой выбор, потому что он приглашает вызывающего добавить или удалить вещи.
Например, иногда у вас есть метод или свойство, которое возвращает результат запроса Linq или использует yield return
для ленивого создания списка, а затем вы понимаете, что было бы лучше сделать это при первом вызове , кешируйте результат в List<T>
и после этого верните кешированную версию. Вот когда возвращение IList
может быть плохой идеей, потому что вызывающий может изменить список в своих целях, что затем испортит ваш кеш, сделав их изменения видимыми для всех других абонентов.
Лучше вернуть IEnumerable<T>
, так что все, что у них есть, - это итерация вперед. И если вызывающий абонент хочет быстрого произвольного доступа, то есть они хотят, чтобы они могли использовать [] для доступа по индексу, они могут использовать ElementAt
, который Linq определяет так, что он тихо нюхает за IList
и использует это, если доступно, а если нет, то он немой линейный поиск.
Одна вещь, которую я использовал ToList
для, когда у меня есть сложная система выражений Linq, смешанная с пользовательскими операторами, которые используют yield return
для фильтрации или преобразования списков. Переход в отладчик может стать очень запутанным, поскольку он перескакивает вокруг ленивой оценки, поэтому я иногда временно добавляю ToList() в несколько мест, чтобы я мог легче следовать пути выполнения. (Хотя, если вещи, которые вы выполняете, имеют побочные эффекты, это может изменить смысл программы.)
Согласен, что ToList оценивает немедленно. Наше мышление заключается в том, что в LINQtoSQL это может повлиять на производительность (особенно, если мы объединяем несколько выражений LINQ), но когда мы находимся в памяти, любой удар по производительности будет небрежным, а последовательность для людей больше важный. – 2008-12-02 16:56:30
Имеются значительные отличия от производительности. В частности, если что-либо о запросе (например, данные в источнике) изменяется, то отложенное выполнение даст вам другой ответ. Иногда это то, что вы хотите, иногда это не так. – 2008-12-02 17:08:33