Reputation: 50
I've been digging around and I can't get an answer that convinced me. Until recently I thought that the number of lines of code depend only on the complete lines of code, I mean, every line of code with a real purpose which is more or less what MSDN says that the count is based on the IL code; but then I ran into a case like this ...
public static System.Collections.Generic.IEnumerable<string> Test(System.Collections.Generic.IList<string> values)
{
var listX = values.Where(x => !string.IsNullOrEmpty(x)).Select(y => y).Where(w => w.StartsWith("x"));
return listX;
}
...where the counter of lines of code counts 6 diferent lines. Can some one tell me what's really going on, how is that IL interpreted linq queries as it makes 3 diferent lines of a single line of code; even more how can I explain that the use of linq brakes the rule of amount of lines per method? Thanks
Upvotes: 2
Views: 79
Reputation: 26927
It appears the as part of using IL to approximate lines of codes, lambda expressions are counted as if they are separately defined methods.
Your sample LINQ query has 3 lambda expressions (one no effect Select
and two Where
s that could be easily combined into one) each of which are compiled into a delegate.
The lines of code are counted as if written as follows:
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;
}
Consider
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; }
How many lines of code should be counted?
Upvotes: 1