In another question on SO I answered with code like the one below and got a comment that the LINQ-query probably was evaluated in every iteration of the for/each. Is that true?
I know that LINQ-querys does not executes before its items is evaluated so it seems possible that this way to iterate the result can make it run on every iteration?
Dim d = New Dictionary(Of String, String)()
d.Add("Teststring", "Hello")
d.Add("1TestString1", "World")
d.Add("2TestString2", "Test")
For Each i As String In From e In d Where e.Value.StartsWith("W") Select e.Key
MsgBox("This key has a matching value:" & i)
Next
NO... in a foreach, the "GetEnumerator" is called only once (ever), and that is used going forward.
EDIT: I put a statement here about the result set being stored temporarily... that's only true for some cases... not this one, so I took it out.
EDIT: Please forgive this for being overly verbose... but I wanted to show you what is happening... so here's a Console app :)
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
foreach (string item in MyCustomEnumerator()
.Where(item => item.StartsWith("abc")))
{
Console.WriteLine(item);
}
}
static IEnumerable<string> MyCustomEnumerator()
{
Console.WriteLine(DateTime.Now);
yield return "abc1";
Console.WriteLine(DateTime.Now);
yield return "abc2";
Console.WriteLine(DateTime.Now);
yield return "abc3";
Console.WriteLine(DateTime.Now);
yield return "xxx";
}
}
}
EDIT: This will result in a DateTime, then abc1, then a DateTime, then abc2, then a DateTime, then abc3, then a DateTime.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With