当我期望“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 blog series 。它相当长(而且还没有完成),但它会让您更深入地了解 LINQ to Objects 的工作原理。
关于c# - 为什么 IEnumerable.Count() 重新评估查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5050326/