为什么执行lambda表达式中的方法

时间:2015-08-06 02:04:57

标签: c# lambda ienumerable

我有一个简单的测试程序,并想知道为什么控制台 输出是1而不是6? 谢谢。

static void Main(string[] args)
    {
        var t = new List<int>() {1, 1, 1, 1, 1};
        var s = new List<int>() {1};

        var g = t.Select(a => test(a, s));
            Console.WriteLine(s[0]);    
    }

    private static int test(int a, List<int> s )
    {
        s[0]++;
        return a;
    }

1 个答案:

答案 0 :(得分:8)

IEnumerable is lazy。在需要之前不会对表达式求值,因此永远不会调用test

添加Console.WriteLine(g.ToList());,您将看到现在如何调用test方法。您可以使用以下命令强制在代码中对其进行评估:var g = t.Select(a => test(a, s)).ToList();这将导致可枚举值被计入列表。

请参阅Lazy Evaluation

  

在编程语言理论中,惰性评估或按需调用是一种评估策略,它将表达式的评估延迟到需要它的值(非严格评估),并且还避免重复评估(共享)。 / p>

注意:通常不鼓励使用导致副作用的LINQ代码,请参阅this blog post的第4段。