为什么Lambda表达式中的方法会被执行

3

我有一个简单的测试程序,想知道为什么控制台输出是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;
    }

2
由于延迟执行,请在Select行的末尾添加.ToList() - Blorgbeard
1个回答

8

IEnumerable是惰性的。只有在需要时才会评估表达式,因此从未调用test

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

请参见惰性求值

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

注意:通常不鼓励使用引起副作用的LINQ代码,请参见此博客文章的第四段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接