Покрытие кода имеет некоторое значение, но иначе я склонен полагаться больше на профилирование кода, чтобы сказать, является ли код дрянным.
Предполагая, что мы говорим о LinqToObjects (очевидно, LinqToSql, LinqToW независимо от их собственных правил), первый будет немного медленнее, поскольку должен быть создан новый итератор, но маловероятно когда-нибудь заметите разницу. С точки зрения количества сравнений и количества проверенных элементов время выполнения этих двух задач будет практически одинаковым.
Если вы обеспокоены, то не произойдет, так это то, что оператор .Where фильтрует список до n элементов, а .FirstOfDefault выбирает первое из отфильтрованного списка. Обе последовательности будут замкнуты правильно
Если предположить, что в обоих случаях вы используете методы расширения, предоставляемые статическим классом Enumerable
, тогда вам будет сложно измерить разницу между 2.
Более длинная форма ...
myCollection.Where(...).FirstOrDefault()
... (технически) будет производить больше операций с памятью (создавая промежуточный итератор для обработки предложения Where ()
) и включать еще несколько циклов обработки.
Дело в том, что эти итераторы ленивы - предложение Where ()
не пройдет через весь список, оценивающий предикат, он будет проверять только как столько предметов, сколько необходимо, чтобы найти один, через который можно пройти.