In performance point of view what should you use "Nested foreach's" or "lambda/linq queries"?
No, LINQ iterators are not and will never be faster than foreach .
There is no performance difference between LINQ queries and Lambda expressions.
Yes, it's slower.
Write the clearest code you can, and then benchmark and profile to discover any performance problems. If you do have performance problems, you can experiment with different code to work out whether it's faster or not (measuring all the time with as realistic data as possible) and then make a judgement call as to whether the improvement in performance is worth the readability hit.
A direct foreach
approach will be faster than LINQ in many cases. For example, consider:
var query = from element in list where element.X > 2 where element.Y < 2 select element.X + element.Y; foreach (var value in query) { Console.WriteLine(value); }
Now there are two where
clauses and a select
clause, so every eventual item has to pass through three iterators. (Obviously the two where clauses could be combined in this case, but I'm making a general point.)
Now compare it with the direct code:
foreach (var element in list) { if (element.X > 2 && element.Y < 2) { Console.WriteLine(element.X + element.Y); } }
That will run faster, because it has fewer hoops to run through. Chances are that the console output will dwarf the iterator cost though, and I'd certainly prefer the LINQ query.
EDIT: To answer about "nested foreach" loops... typically those are represented with SelectMany
or a second from
clause:
var query = from item in firstSequence from nestedItem in item.NestedItems select item.BaseCount + nestedItem.NestedCount;
Here we're only adding a single extra iterator, because we'd already be using an extra iterator per item in the first sequence due to the nested foreach
loop. There's still a bit of overhead, including the overhead of doing the projection in a delegate instead of "inline" (something I didn't mention before) but it still won't be very different to the nested-foreach performance.
This is not to say you can't shoot yourself in the foot with LINQ, of course. You can write stupendously inefficient queries if you don't engage your brain first - but that's far from unique to LINQ...
If you do
foreach(Customer c in Customer) { foreach(Order o in Orders) { //do something with c and o } }
You will perform Customer.Count * Order.Count iterations
If you do
var query = from c in Customer join o in Orders on c.CustomerID equals o.CustomerID select new {c, o} foreach(var x in query) { //do something with x.c and x.o }
You will perform Customer.Count + Order.Count iterations, because Enumerable.Join is implemented as a HashJoin.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With