I'm coming to C# from Python where we have generator comprehensions such as
nums = range(2, 10)
evenSquares = (num*num for num in nums if num % 2 == 0)
for evenSquare in evenSquares:
print(evenSquare)
The above would print
4
16
36
64
I was looking for a C# equivalent or near-equivalent to Python's generator comprehension and found two candidates
- LINQ query expressions
- Using
IEnumerablequery methods (e.g.WhereandSelect).
The above Python snippet could be done in C# as either
// LINQ query expression
IEnumerable<int> nums = Enumerable.Range(2, 8);
IEnumerable<int> evenSquares =
from num in nums
where num % 2 == 0
select num*num;
or
// Using IEnumerable.Where and IEnumerable.Select
IEnumerable<int> nums = Enumerable.Range(2, 8);
IEnumerable<int> evenSquares =
nums.Where(num => num % 2 == 0).Select(num*num);
and in either case
foreach (int evenSquare in evenSquares) {
Console.WriteLine(evenSquare);
}
would also print
4
16
36
64
So I was wondering which of the two
- LINQ query expression, or
- Using IEnumerable.Where and IEnumerable.Select
is preferred and why.
AFAIK, like Python generator comprehensions which are evaluated lazily, LINQ query expressions and IEnumerable.Where and IEnumerable.Select are also evaluated lazily (the C# docs call it deferred execution, but I'm guessing it's the same as lazy evaluation, right?)