当我期望“1 1 1 1”时,以下代码打印“2 2 2 2”。为什么“Count()”重新评估查询?
class Class1
{
static int GlobalTag = 0;
public Class1()
{
tag = (++GlobalTag);
}
public int tag;
public int calls = 0;
public int Do()
{
calls++;
return tag;
}
}
class Program
{
static void Main(string[] args)
{
Class1[] cls = new Class1[] { new Class1(), new Class1(), new Class1(), new Class1() };
var result = cls.Where(c => (c.Do() % 2) == 0);
if (result.Count() <= 10)
{
if (result.Count() <= 10)
{
foreach (var c in cls)
{
Console.WriteLine(c.calls);
}
}
}
}
}
不然还能怎样呢?你会期待什么Count()
为了缓存值要做什么?
LINQ to Objects 通常延迟执行,仅在需要时才实际评估查询 - 例如对元素进行计数。所以调用Where
根本不评估序列;它只记住谓词和序列,以便在需要时对其进行评估。
有关 LINQ to Objects 如何工作的更多详细信息,我建议您阅读我的Edulinq 博客系列 http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx。它相当长(而且不是quite已完成),但它会让您更深入地了解 LINQ to Objects 的工作原理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)