为什么 IEnumerable.Count() 重新评估查询?

2023-12-23

当我期望“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(使用前将#替换为@)

为什么 IEnumerable.Count() 重新评估查询? 的相关文章

随机推荐