我有一个可观察集合的层次结构,有点像这样:
interface IItem
{
ObservableCollection<IItem> Children { get; }
}
给定一个IItem
(或ObservableCollection<IItem>
),我想构造另一个可观察的集合,该集合可重新包含所有子IItem
项。然后,此集合将用作WPF列表视图的数据源(例如)。
修改这些项目中的任何一个以具有额外的子项都应更新生成的可观察集合。请注意,没有循环引用。
我知道CompositeCollection类,我相信这应该会对我有所帮助(我认为我所需要的只是一个递归地包含Children
中每个子级的复合集合的复合集合),但我看不到一种巧妙的方法来做到这一点,因为这个类没有能力将子级"模板化"到所需的复合集合中。
您是如何使用这个扁平列表的?你需要不时地列举一下吗?考虑以下内容:
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;
}
}
}
这基本上使层次结构变平,并允许您遍历所有项目。由于它很懒,所以总是在旅途中进行评估。并且与对层次结构中的单个项所做的更改一致(只要不同时枚举和更改)。
编辑:
扁平集合根本不是集合,它是包含层次结构中所有项的项序列的表示。这意味着,如果你在某个项目中添加(或删除)子项,你将在更改前后获得一致的结果。
考虑以下内容:
项目项=buildItemHierarchy();var flat=迭代(项);项目Children。RemoveAt(2);//假设2存在
flat现在"包含"原始树中的所有项,而不包含从根(递归!)的第二个子级传播的分支