C# 下面的LINQ语句是如何工作的?

C# 下面的LINQ语句是如何工作的?,c#,.net,linq,C#,.net,Linq,下面的语句是如何工作的 这是我的密码: var list = new List<int>{1,2,4,5,6}; var even = list.Where(m => m%2 == 0); list.Add(8); foreach (var i in even) { Console.WriteLine(i); } var list=新列表{1,2,4,5,6}; var偶数=列表,其中(m=>m%2==0); 增加(8); foreach(var i为偶数) { 控制

下面的语句是如何工作的

这是我的密码:

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
    Console.WriteLine(i);
}
var list=新列表{1,2,4,5,6};
var偶数=列表,其中(m=>m%2==0);
增加(8);
foreach(var i为偶数)
{
控制台写入线(i);
}
输出:
2,4,6,8


为什么不
2,4,6

由于以下原因,输出为
2,4,6,8

当查询变量 是迭代的,而不是在创建查询变量时。 这称为延迟执行

--苏普罗蒂姆·阿加瓦尔

还有另一个名为的执行,用于缓存查询结果。再次来自Suprotim Agarwal:

要强制立即执行不生成单例值的查询,可以对查询或查询变量调用
ToList()、ToDictionary()、ToArray()、Count()、Average()
Max()
方法。这些被称为转换运算符,它允许您对结果进行复制/快照,并且可以根据需要多次访问,而无需重新执行查询

如果希望输出为
2,4,6
,请使用:

var list=新列表{1,2,4,5,6};
var even=list.Where(m=>m%2==0.ToList();
增加(8);
foreach(var i为偶数)
{
控制台写入线(i);
}

发生这种情况是因为延迟执行,这意味着表达式的计算直到需要时才会执行。如果数据太大,这会使性能更好。

原因是lambda表达式的延迟执行。当您开始在foreach循环中迭代时,查询将被执行。

您之所以得到这个结果,是因为延迟执行,这意味着直到第一次访问结果时才对其进行计算

为了更清楚,只需在snipet末尾的列表中添加10,然后再次打印,输出中将不会得到10

     var list = new List<int>{1,2,4,5,6};
    var even = list.Where(m => m%2 == 0).Tolist();
    list.Add(8);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }
//new*
    list.Add(10);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }
var list=新列表{1,2,4,5,6};
var even=list.Where(m=>m%2==0.Tolist();
增加(8);
foreach(var i为偶数)
{
控制台写入线(i);
}
//新的*
增加(10);
foreach(var i为偶数)
{
控制台写入线(i);
}

当您使用从LINQ获得的IEnumerable时,只会创建一个枚举器类,并且迭代只会在您在某次漫游中使用它时开始

Count()、Max()、Avg()、Sum()以及可能需要考虑整个列表的其他方法也会导致查询的计算。我经常考虑将“filteredList”作为变量,而不是将“filterList()”作为方法-其思想是,每次要过滤列表时都要对其进行迭代,而不是调用一个方法。这可能是一种有趣的方法,尽管不寻常,但在性能方面可能不完美。@Sebastian-进一步了解@Kenned的评论,
.First()
.FirstOrDefault()
.Single()
.SingleOrDefault()
也会触发对查询的评估。令人惊讶的是,你是如何在30秒内得到答案的:D@M.C我不知道你为什么问这个问题。没有一次给出完整的答案。它被编辑了好几次。查询表达式的结果是一个查询,而不是查询的执行。要了解更多信息,请参阅接受的答案。当然,您可以想出一个标题来实际概括该问题。我对否决票的猜测(到目前为止为6票,不是我的)是因为他们认为题目太笼统,是一个很好的问题。但是,看到向上投票的数量,并成为时事通讯中本周的首要问题,我认为您不必太担心。从技术上讲,这是迭代器的延迟执行,而不是lambda。您可能会对此有所细微差别,因为这也可能意味着您昂贵的枚举正在执行多次。在这种情况下,您甚至可能会遭受性能损失。您真的尝试过吗?我在输出中得到
10
。好的catch@MarkHurd yes没有添加。ToList()。现在编辑了这篇文章,它应该会给出预期的输出。我的期望是,表达式只有在您第一次使用var时才被计算,但它似乎每次都会被计算,因为它不会在任何一个输出中包含
8
     var list = new List<int>{1,2,4,5,6};
    var even = list.Where(m => m%2 == 0).Tolist();
    list.Add(8);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }
//new*
    list.Add(10);
    foreach (var i in even)
    {
        Console.WriteLine(i);
    }