编程语言
首页 > 编程语言> > c# – Linq查询中出现意外结果

c# – Linq查询中出现意外结果

作者:互联网

我有一个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的重要组成部分,为了效率而存在.延迟执行节省了大量的时间和资源b / c可以提前中止查询,因此,如果我们不需要尾端,我们就浪费了时间和内存.此外,如果结果集是巨大的,那么它是低效的. (想想啜饮文件而不是用例如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()时完整执行.您的原始列表保留在团队中,而您在IEnumerable中拥有“额外”人员.

标签:c,linq,winforms,net-3-5
来源: https://codeday.me/bug/20190722/1498990.html