Skip to main content
 首页 » 编程设计

c#之关于 IEnumerableT> 集合的奇怪问题

2024年02月23日31lyj

我有以下代码:

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不是一个列表,而是每次被要求时都会得到一个列表的 promise 。

所以,如果BuildRootTreeItems()创建IEnumerable<TreeItem>使用 LINQ 查询,它不会强制执行使用 .ToList() 的查询或 .ToArray()然后每次你使用 rootTreeItems您正在 BuildRootTreeItems() 中重新执行查询

调用 rootTreeItems.ElementAt(0)将导致查询执行。如果稍后您尝试调用 rootTreeItems.ElementAt(0)再次执行查询并取回第一个 TreeItem 的不同实例.

尝试像这样更改第一行:

IEnumerable<TreeItem> rootTreeItems = BuildRootTreeItems().ToArray(); 

这会强制执行并防止稍后重新执行。我敢打赌你的问题就会消失。