我有一个可观察集合的层次结构,有点像这样:
interface IItem
{
ObservableCollection<IItem> Children { get; }
}
给定IItem
(或ObservableCollection<IItem>
)我想构建一个其他可观察的集合,该集合可以重复包含所有子IItem
项。然后,此集合将用作WPF列表视图的数据源(例如)。
修改任何这些项目以包含其他子项应更新生成的可观察集合。请注意,没有循环引用。
我知道CompositeCollection Class并且我确信这应该对我有用(我认为我需要的是一个复合集合递归地包含Children
中每个孩子的复合集合) ,但是我看不到这样做的简洁方法,因为这个类没有能力将子模板“模板化”到所需的复合集合中。
答案 0 :(得分:0)
你是如何使用这个扁平列表的?你需要不时列举它吗? 请考虑以下事项:
IEnumerable<Item> iterate(Item item)
{
if (item == null)
yield break;
yield return item;
foreach(Item i in item.Children)
{
foreach(Item ii in iterate(i){
yield return ii;
}
}
}
这基本上使层次结构变平,并允许您遍历所有项目。由于它是懒惰的,它总是在旅途中进行评估。并且与层次结构中对单个项目所做的更改一致(只要您不同时枚举和更改)。
修改强>
flattend集合根本不是集合,它是包含层次结构中所有项目的一系列项目的表示。这意味着如果您从某个项目添加(或删除)子项,您将在更改之前和之后获得一致的结果。
请考虑以下事项:
Item item = buildItemHierarchy(); var flat = iterate(item); item.Children.RemoveAt(2); //假设2存在
flat now'包含'来自原始树的所有项目,没有从根的第二个子节点突然出现的分支(递归!)