在foreach中的Enumerable.Where中无法访问C#对象属性

在foreach中的Enumerable.Where中无法访问C#对象属性,第1张

概述发现了一个c#head-scratcher.在foreach循环中,直接在Enumerable.Where中使用parent.Id属性不起作用.首先将它放在一个变量中.在Select语句中直接访问parent.Id没有问题. List<Person> people = new List<Person>() { new Person() { Id = 1, name = "John 发现了一个c#head-scratcher.在foreach循环中,直接在Enumerable.Where中使用parent.ID属性不起作用.首先将它放在一个变量中.在Select语句中直接访问parent.ID没有问题.

List<Person> people = new List<Person>() {         new Person() { ID = 1,name = "John",parentID = null },new Person() { ID = 2,name = "Sarah",new Person() { ID = 3,name = "DanIEl",parentID = 1 },new Person() { ID = 4,name = "Peter",parentID = 1 }    };    List<object> peopleTree = new List<object>();    var parents = people.Where(p => !p.parentID.HasValue);    foreach (Person parent in parents)    {        int parentID = parent.ID;        var children = people            //.Where(p => p.parentID.Equals(parentID)) //This works,is able to find the children            .Where(p => p.parentID.Equals(parent.ID)) //This does not work,no children for John            .Select(p => new { ID = p.ID,name = p.name,pID = parent.ID }); //pID set correctly        peopleTree.Add(new        {            ID = parent.ID,name = parent.name,Children = children        });    }

或者,如果我使用for循环并将parent放在变量中,我可以直接在Where语句中访问parent.ID属性.

var parents = people.Where(p => !p.parentID.HasValue).ToArray();for (int IDx = 0; IDx < parents.Count(); IDx++){    var parent = parents[IDx];...

我无法找到它为何如此行为的答案.
有人能解释一下吗?

解决方法 此问题是由子项的延迟执行创建的.从本质上讲,评估孩子时父母的价值是不同的. Geekspeak为此是 Accessing Modified Closure.

您可以通过引入临时方式来修复它,或者在foreach循环仍在当前迭代中时强制进行评估:

var children = people    .Where(p => p.parentID.Equals(parent.ID))    .Select(p => new { ID = p.ID,pID = parent.ID })    .ToList();
总结

以上是内存溢出为你收集整理的在foreach中的Enumerable.Where中无法访问C#对象属性全部内容,希望文章能够帮你解决在foreach中的Enumerable.Where中无法访问C#对象属性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1219587.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存