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

标签 c# linq

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

相关文章:

c# - 替换作为属性/公共(public)字段检索的对象列表中的元素

c# - Datalogic 条形码/重量扫描仪

linq - 如何在EF中订购实体的子级集合

c# - 为什么我不能使用 base.Select 在 List<string> 的子类中使用 Linq Select?

c# - 使用 LINQ GroupBy 获取忽略属性的唯一集合

c# - 如何返回 LINQ 结果并显示在 View 中?

c# - WPF中的拉丝钢刷?

javascript - 当教科书有任何值时,将自动选择下拉选项

c# - 枚举解析。字符串 anchor

c# - 将 foreach 循环转换为 LINQ 查询会破坏代码