'What does "object is enumerated" mean in C#?
I've been reading lately articles and documentation about deferred execution, LINQ, querying in general etc. and the phrase "object is enumerated" came up quite often. Can someone explain what happens when an object gets enumerated?
Example article.
This method is implemented by using deferred execution. The immediate return value is an object that stores all the information that is required to perform the action. The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C#
Solution 1:[1]
General explainations for enumeration
IEnumerable
is an interface, that is usually implemented by collection types in C#. For example List
, Queue
or Array
.
IEnumerable
provides a method GetEnumerator
which returns an object of type IEnumerator
.
The IEnumerator
basically represents a "forward moving pointer" to elements in a collection.
IEnumerator
has:
- the property
Current
, which returns the object it currently points to (e.g. first object in your collection). - a method
MoveNext
, which moves the pointer to the next element. After calling it,Current
will hold a reference to the second object in your collection.MoveNext
will returnfalse
if there were no more elements in the collection.
Whenever a foreach
loop is executed, the IEnumerator
is retreived and MoveNext
is called for each iteration - until it eventually returns false
. The variable you define in your loop header, is filled with the IEnumerator
's Current
.
Compiling a foreach loop
thx to @Llama
This code...
List<int> a = new List<int>();
foreach (var val in a)
{
var b = 1 + val;
}
is transformed to something like this by the compiler:
List<int> list = new List<int>();
List<int>.Enumerator enumerator = list.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int current = enumerator.Current;
int num = 1 + current;
}
} finally {
((IDisposable)enumerator).Dispose();
}
The quote
The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C#.
GetEnumerator
is automatically called, as soon as you put your object into a foreach
loop, for example. Of course, other functions, e.g. Linq queries, can also retreive the IEnumerator
from your collection, by doing so either explicit (call GetEnumerator
) or implicit in some sort of loop, like I did in my sample above.
Solution 2:[2]
I think you just need a good understanding of deferred vs. immediate execution for LINQ queries.
Deferred execution: When you write a LINQ query it is only executed when you actually access the results - deferred until you run code to iterate with i.e. a foreach
over the results. This is the default behaviour.
Immediate execution: We can force this (which you'll see often in C# code) by appending a ToList()
or similar method to the query.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Ben Hall |