在关于SO的另一个问题中,我回答了类似下面的代码并得到了一个评论,即LINQ查询可能在for/each的每次迭代中都得到了评估.真的吗?
我知道LINQ-querys在它的项目被评估之前没有执行,因此这种迭代结果的方式似乎可以使它在每次迭代中运行?
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
Run Code Online (Sandbox Code Playgroud)
不......在foreach中,"GetEnumerator"只被调用一次(永远),并且在未来使用.
编辑:我在这里写了一个关于临时存储的结果集的声明......这只适用于某些情况......不是这个,所以我把它拿出来了.
编辑:请原谅这个过于冗长...但我想告诉你发生了什么...所以这是一个控制台应用程序:)
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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这将导致DateTime,然后是abc1,然后是DateTime,然后是abc2,然后是DateTime,然后是abc3,然后是DateTime.
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |