C# LINQ Background Topics
Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
IEnumerable<T> - Using generators
Let's continue using the unbounded GetFibonacci() generator method from the previous lesson. Take a look at this line of code:
Console.WriteLine(GetFibonacci().Count());
What will this print?
Actually, it won't print anything. It will process for a while, and then eventually fail with the error:
System.OverflowException: Arithmetic operation resulted in an overflow.
Why do you think this is?
Eventually, the numbers produced by the GetFibonacci() method get large enough that they don't fit into an int. This is the cause of the OverflowException.
NOTE: The
Count()method used above is a LINQ method. You can find more details in the Using C# LINQ course.
Iterating an unbounded generator
Here is another example using the GetFibonacci() method:
// Will print:
// Value: 1
// Value: 2
// Value: 3
// Value: 5
// Value: 8
int i = 0;
foreach (int val in GetFibonacci())
{
if (i > 4) break;
Console.WriteLine($"Value: {val}");
i++;
}
This is one way to (quite literally) break out of the infinite iteration of this sequence.
Indexing into an IEnumerable<T>
You might be tempted to try to do this:
IEnumerable<int> fibonacci = GetFibonacci();
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Value: {fibonacci[i]}");
}
It won't work, though.
IEnumerable<T> doesn't support the [ ] indexer operator, which somewhat makes sense. This Fibonacci generator isn't a static array that you can index into. It is a method call that returns a series of values as the result of an evaluation. So in order to retrieve the value at index i, you would need to evaluate the generator method i times.
Making the sequence bounded with Take()
Here is another way to get the first 5 values of the sequence:
// Will print:
// Value: 1
// Value: 2
// Value: 3
// Value: 5
// Value: 8
foreach (int val in GetFibonacci().Take(5))
{
Console.WriteLine($"Value: {val}");
}
In this example, the Take() method is a LINQ method that returns a bounded iterator to the first 5 values of the sequence provided by GetFibonacci().