Saturday 24 August 2019

Difference between IEnumerable and IEnumerator

This is asked very frequently in any .net framework interview

Things that should be noted-

Here is the documentation on Enumerator.
IEnumerator is used to go through list
IEnumerator has one object type property i.e Current which has getter only and two methods
         MoveNext that returns boolean
         Reset

Code sample

IEnumerator enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())
{
    object element = enumerator.Current;
    // Perform your logic logic on the element
}
Let's consider a scenario where you have to loop through a collection in two different methods

take the example above
List<int> enumerable = new List<int>();
for (int i = 0; i <= 20; i++)
{
   enumerable.Add(i);
}

IEnumerator enumerator = enumerable.GetEnumerator();

Console.WriteLine("FirstLoopMethod start...");
while (enumerator.MoveNext())
{
    object element = enumerator.Current;
    int num = int(element);
    Console.WriteLine(num);
    if(num > 100)
    {
       SecondLoopMethod(enumerator);
    }
// you logic here // Perform your logic logic on the element }
private void SecondLoopMethod(IEnumerator enumerator)
{
    Console.WriteLine();
    Console.WriteLine("SecondLoopMethod start...");
    while (enumerator.MoveNext())
    {
       object element = enumerator.Current;
      int num = int(element);
      Console.WriteLine(num);
      // Perform your logic logic on the element
   }
}
This is the output you get


Here you can see in the SecondLoopMethod the iteration started from where we left it in the first method

That's the benefit and control of using IEnumerator

Where if we try to this with IEnumerable then in the second method it again start looping from the beginning

Documetation for Enumerable.
We can loop throgh items of list using IEnumerator too
IEnumerable and IEnumerator are both interfaces in the .net framework
IEnumerable has just one method declaration i.e. GetEnumerator which return an enumerator
Every object which can be looped through using foreach, inherit from IEnumerable directly or indirectly
You cannot use foreach on classes which do not inherit from IEnumerable
If you have a model and want to loop through its array using foreach then you must that class must inherit from IEnumerable

Code sample

foreach(object item in enumerable)
{
    // Perform logic on the item
}
When your code executes the above code becomes

IEnumerator enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())
{
    object item = enumerator.Current;
    // Perform logic on the item
}
Now what are the benefits and drawbacks of both 
IEnumerable simplifies and shortens the original looping syntax compared to IEnumerator

  1. IEnumerator provide better flexibility and control over your looping logic

3 comments:

Send All Azure App Insights Or Logs Data To Tool Like Datadog

  Introduction Microsoft Azure provides a variety of insights and monitoring logs that you can monitor to check the state of a resource and ...