当我期望“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/

10-13 06:26