对不起,恐怕无法明确提出问题并显示代码示例。
情况:
一旦我有这样的方法返回IEnumerable<T>,同时,在某个时候,当使用 help 遍历元素时foreach,结果证明元素不再存在(好像是IEnumerable<T>空的)。尽管事实上该方法最初返回了一个非空列表。
//Допустим, метод GetElements() возвращает не пустой IEnumerable<Element>
var elements = SomeStaticClass.GetElements();
//затем не помню что происходит
//в итоге
foreach (var element in elements)
{
//сюда не разу не зашли
}
也就是说,在某些情况下,它IEnumerable<T>只是一个枚举器,已经没有数据了。
但是,如果您先执行此操作GetElements().ToArray(),则不再观察到此类问题。
//Допустим, метод GetElements() возвращает не пустой IEnumerable<Element>
var elements = SomeStaticClass.GetElements().ToArray(); //!!!!!
//затем не помню что происходит
//в итоге
foreach (var element in elements)
{
//сюда зашли много раз
}
问题:
在什么情况下会发生这种情况?知道这一点很有用,以免每次都产生ToArray(),即使没有必要。
执行 LINQ 查询有两种方法:延迟执行和立即执行。
在延迟执行的情况下,LINQ 表达式在迭代或迭代选择之前不会执行。
更具体地说,当 linq 查询返回 IEnumerable 时,这些查询称为“延迟”。最终返回 IEnumerable 的延迟查询可以一遍又一遍地枚举,从源中获取最新数据。在这种情况下,您不需要调用或重新声明请求,即延迟请求创建后的执行。在 foreach 循环中迭代时执行结果的接收。
方法 ToList、ToArray、ToXXX 并返回一个原子值或一个元素称为“立即”。
这些方法立即执行