我有以下代码:
IEnumerable<TreeItem> rootTreeItems = BuildRootTreeItems();
BuildTreeView(rootTreeItems.ElementAt(0));
private static void BuildTreeView(TreeItem treeItem)
{
TreeItem subMenuTreeItem = new TreeItem();
subMenuTreeItem.Header = "1";
TreeItem subMenuTreeItem2 = new TreeItem();
subMenuTreeItem.Header = "2";
treeItem.TreeItems.Add(subMenuTreeItem);
treeItem.TreeItems.Add(subMenuTreeItem2);
}
奇怪的是,在BuildTreeView返回之后,rootTreeItems的第一个元素没有任何子节点,而在调试BuildTreeView方法时确实具有子节点。
这个问题的确困扰了我很长时间,有人知道吗?非常感谢。
最佳答案
您最有可能遇到IEnumerable<>
的延迟执行问题。要记住的是,您的IEnumerable<TreeItem> rootTreeItems
不是列表,而是每当被要求这样做时都会得到列表的保证。
因此,如果BuildRootTreeItems()
使用LINQ查询创建IEnumerable<TreeItem>
并且不强制使用.ToList()
或.ToArray()
执行查询,则每次使用rootTreeItems
时,您都将重新执行查询内BuildRootTreeItems()
调用rootTreeItems.ElementAt(0)
将导致查询执行。如果以后尝试再次调用rootTreeItems.ElementAt(0)
,则将重新执行查询并获取第一个TreeItem
的其他实例。
尝试像这样更改第一行:
IEnumerable<TreeItem> rootTreeItems = BuildRootTreeItems().ToArray();
这将强制执行,并在以后阻止重新执行。我敢打赌,你的问题就解决了。
关于c# - 关于IEnumerable <T>集合的怪异问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7185010/