So a couple of posts I read recently have been about readability of Linq, more so Linq query expressions versus the Linq methods. Don’t know what I mean?
Expression:
var result = from knowledge in Sean select knowledge.Linq;
As opposed to:
var result = Sean.Select(knowledge => knowledge.Linq);
Personally I would replace the lambda expression with a Func, but I can live with it right now. Anywho, the argument is that the first looks better than the second. I really don’t see this as a looks problem, but a useage problem. Fact is, they both have their uses and you should know how to read both. Why is that? Well here’s an example CAUSE I KNOW YOU WANT ONE!
One of my earlier posts had to do with solving the FizzBuzz thing with Linq where I gave you this bad ass solution:
var result = listToConvert .Where(WhereBothDivisible(fizzNumber, buzzNumber)) .Select(selectKeyValuePair("FizzBuzz")) .Concat( listToConvert .Where(WhereBuzzDivisable(fizzNumber, buzzNumber)) .Select(selectKeyValuePair("Buzz"))) .Concat( listToConvert .Where(WhereFizzDivisable(fizzNumber, buzzNumber)) .Select(selectKeyValuePair("Fizz"))) .Concat( listToConvert .Where(WhereNeitherDivisable(fizzNumber, buzzNumber)) .Select(selectKeyValuePair("Nothing")));
As you can see, I’ve used both Func fields and methods to return Funcs to clean up how this would look. I’ll even show what it would look like without this approach:
var result = listToConvert.Where(currentItem => IsDivisible(currentItem, fizzNumber) && IsDivisible(currentItem, buzzNumber) ).Select(currentItem => new KeyValuePair(currentItem, "FizzBuzz")).Concat(...
Now I can totally admit that this second one I am showing is just ouch. So the first lesson to be learn is that Funcs and Methods that return Funcs can significantly clean up the Linq Method approach.
Now you could do the same with expressions:
var fizzBuzz = from currentNumber in listToConvert where WhereBuzzDivisable(fizzNumber, buzzNumber) select selectKeyValuePair("FizzBuzz"); var buzz = from currentNumber in listToConvert where WhereBuzzDivisable(fizzNumber, buzzNumber) select selectKeyValuePair("Buzz"); var fizz = from currentNumber in listToConvert where WhereFizzDivisable(fizzNumber, buzzNumber) select selectKeyValuePair("Fizz"); var neither = from currentNumber in listToConvert where WhereNeitherDivisable(fizzNumber, buzzNumber) select selectKeyValuePair("Fizz");
Ok so nice and pretty, but now what? Concatenation. This is where is gets ugly:
fizzBuzz.Concat(fizz.Concat(buzz.Concat(neither))));
OR
var fizzBuzz = from currentNumber in listToConvert where WhereBuzzDivisable(fizzNumber, buzzNumber) select selectKeyValuePair("FizzBuzz") .Concat( from currentNumber in listToConvert where WhereBuzzDivisable(fizzNumber, buzzNumber) select selectKeyValuePair("Buzz")) .Concat(....);
See what I’m getting at? The non expression one is looking a bit better now or maybe this is a fight to see which is less fugly. Now I admit that this may not be the best FizzBuzz solution, but it gives an example or where the Linq queries can go very wrong.