发现了一个让人头疼的C#问题。在foreach循环中,直接使用parent.Id属性作为Enumerable.Where的参数是不起作用的。但是如果先将其放入变量中,则可以正常工作。在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];
...
我找不到为什么会出现这种行为的答案。有人能解释一下吗?