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#
CodePudding user response:
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 your the object it currently points to (e.g. first entry in your collection). - a method
MoveNext, which moves your pointer to the next element. That means thatCurrentwill switch to the second entry in your collection.MoveNextwill returnfalseif 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.
Your question
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#.
Basically it tells you everything already. As soon as someone calls GetEnumerator, the method is executed. GetEnumerator is automatically called, as soon as you put your object into a foreach loop.
CodePudding user response:
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.
