gpt4 book ai didi

c# - Linq 查询中的意外结果

转载 作者:行者123 更新时间:2023-11-30 13:42:58 25 4
gpt4 key购买 nike

我有一个看起来像这样的 Linq 查询:

var myPosse = from p1 in people
select p1;
label1.Text = "All my peeps:" + Environment.NewLine;
foreach (Person p in myPosse)
{
this.label1.Text += p.ToString() + Environment.NewLine;
}

这给了我很好的结果。

但是当我做这样的事情时:

var myPosse = from p1 in people
select p1;
label1.Text = "All my peeps:" + Environment.NewLine;
people.Add(new Person{FirstName="Don", LastName="Cash"});
foreach (Person p in myPosse)
{
this.label1.Text += p.ToString() + Environment.NewLine;
}

我那里有“额外”的人!这到底是怎么回事?我的 Linq 变量是在添加额外人员之前设置的。

最佳答案

这是因为延迟执行,这是 Linq 的一个主要特性。

var 中存储的实际上不是结果集。它实际上是运行查询的潜力。当值分配给变量时,查询不会运行。它仅在需要时运行,并且一点一点地运行。

这是 Linq 的重要组成部分,是为了提高效率。延迟执行节省了大量时间和资源,因为可以提前中止查询,因此,如果我们不需要尾端,我们就浪费了时间和内存。此外,如果结果集非常大,效率也很低。 (想想 slurping 文件而不是用 perl 或 PHP 流式传输文件)。

你不能真正强制立即执行,但这里有一个近似的技巧。

var myPosse = from p1 in people
select p1;
List<Person> theTeam = myPosse.ToList();
label1.Text = "All my peeps:" + Environment.NewLine;
people.Add(new Person{FirstName="Don", LastName="Cash"});
foreach (Person p in theTeam)
{
this.label1.Text += p.ToString() + Environment.NewLine;
}

注意“ToList()”方法。在这种情况下,您的 Linq 查询会在 .ToList() 时刻完全执行。您的原始列表保存在 theTeam 中,而您在 people IEnumerable 中有您的“额外”人员。

关于c# - Linq 查询中的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com