Похоже, как часть использования IL для аппроксимации строк кода, лямбда-выражения учитываются, как если бы они были отдельными методами.
Ваш пример запроса LINQ содержит 3 лямбда-выражения (одно без эффекта Select
и два Where
с, которые можно легко объединить в один), каждый из которых скомпилирован в делегат.
Строки кода считаются, как если бы они были записаны следующим образом:
static bool NotNullOrEmpty(string s) => !String.IsNullOrEmpty(s);
static string SelectSelf(string s) => s;
static bool StartsWithX(string s) => s.StartsWith("x");
public static System.Collections.Generic.IEnumerable<string> Test(System.Collections.Generic.IList<string> values)
{
var listX = values.Where(NotNullOrEmpty).Select(SelectSelf).Where(StartsWithX);
return listX;
}
Рассмотрим
public static System.Collections.Generic.IEnumerable<string> Test(System.Collections.Generic.IList<string> values) {
var listX = values.Where(x => { return !string.IsNullOrEmpty(x); }).Select(y => { return y; }).Where(w => { var xs = "x"; return w.StartsWith(xs); }); return listX; }
Сколько строк кода должно быть подсчитано?