我有以下代码:

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/

10-12 04:33