The yield
keyword makes the method (in which it appears) as an iterator block. An iterator block, or method, will return an IEnumerable
as the result. Within this iterator block or method, we will use the yield
keyword to return the values for the IEnumerable
.
Note that IEnumerable
is lazily evaluted. If you call a method with an iterator block (with yield
keyword), it will not run any code until we actually access the IEnumerable
result values.
Lets see an exmaple.
Usually you may find code similiar to this where we are creating a temp list to hold the items, and at the end return the list from a method:
public IEnumerable<int> MyList() { List<int> list = new List<int>(); list.Add(1); list.Add(2); list.Add(3); list.Add(4); list.Add(5); return list; }
You can simplify the method using the yield return
statement, it allows us to remove the intermediate/temporary list required to hold the values.
public IEnumerable<int> MyList() { yield return 1; yield return 2; yield return 3; yield return 4; yield return 5; }
This method will return the same list of intergers but it does not need a temporary list to hold values.
You can use the yield break
statement to explicitly stop the current iteration and cancel the iterator block. In this case it will return all these values which are produced with yield return
statement. Once it reaches the yield break
statement, it will stop producing any further value and exit the iterator block.
Lets see this example:
public static IEnumerable<int> MyList() { yield return 1; yield return 2; yield break; yield return 3; yield return 4; yield return 5; }
This method will only produce two values 1 and 2. Once it reaches the yield break
statement, it will exit from the iterator block.
Typically you would do this when a certain condition is met, you only want to return a specific set of values from the iterator block.
Let see this example:
IEnumerableTakeWhilePositive(IEnumerable<int> numbers) { foreach (int n in numbers) { if (n > 0) { yield return n; } else { yield break; } } }
If you call this method like:
foreach (var item in TakeWhilePositive(new[] { 1, 2, 3, -1, 4, 5})) { Console.WriteLine(item); }
It will print the values from given array as:
1 2 3
Once it found a negative value, the iteration loop will be stopped and control is returned to the caller method.
Thanks for sharing this blog.
ReplyDeleteTop Engineering College in coimbatore
top 5 colleges in coimbatore for engineering
Best Bio technology engineering college in Coimbatore