from item in range where item % 2 ==0 select i ;
дополнительные методы equivelant его.
range.where(item % 2 ==0).select(x=>x)
.
Я чувствую, что первый способ linq переводит следующий компилятором и если это, так там любая оптимизация компилятором как это range.where(item & 2 == 0)
вместо другого?
Нет, компилятор C# никогда не удалит вызов .Select
в конце LINQ-запроса. Причина в том, что компилятор C# не знает, что делает метод .Select
, и поэтому не может удалить его в качестве оптимизации.
Компилятор не может иметь таких знаний, потому что он привязывается к Select
очень гибко. Он будет рассматривать любой метод экземпляра или расширения с именем Select
на целевом типе, который имеет соответствующую сигнатуру. Вы даже можете определить свои собственные методы Select
для выполнения пользовательских действий, таких как логирование. Если бы компилятор C# удалил пункт Select
в этом случае, он бы сломал этот тип кода.