gpt4 book ai didi

C# 对象属性无法在 Enumerable 中访问。在 foreach 中的位置

转载 作者:行者123 更新时间:2023-11-30 14:09:19 24 4
gpt4 key购买 nike

找到了一个令人头疼的 c#。在 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", parentId = null },
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];
...

我找不到它为什么会这样的答案。谁能解释一下?

最佳答案

此问题是由 children 的延迟执行造成的。本质上,评估childrenparent 的值是不同的。 Geekspeak 是 Accessing Modified Closure .

您可以通过像以前那样引入一个临时变量来修复它,或者在 foreach 循环仍在当前迭代中时强制进行评估:

var children = people
.Where(p => p.parentId.Equals(parent.Id))
.Select(p => new { Id = p.Id, Name = p.name, pId = parent.Id })
.ToList();

关于C# 对象属性无法在 Enumerable 中访问。在 foreach 中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034741/

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