LINQ query expression vs using IEnumerable.Where and IEnumerable.Select

61 views Asked by At

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 IEnumerable query methods (e.g. Where and Select).

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?)

0

There are 0 answers