我需要创建或使用现有的.NET FW FlatCollection。 我对FlatCollection的意思是,一个Collection,当一个元素通过Add方法/函数插入时,将检查该元素,如果这个元素是IEnumerable,将从这样的IEnumerable中获取所有元素并将它们添加到采集。 (此行为仅适用于根IEnumerable,但是,递归地应用于子IEnumebles也可能是好的,虽然更难)。诀窍是,这个FlatCollection是一个索引集合,需要保留其元素的顺序。
假设用户将3个元素的IEnumerable添加到Collection中,之后在某个时刻向被引用的集合添加一个新元素; FlatCollection需要注意列表已更改大小,并更新其内部集合以反映新元素,维护顺序。因此,例如,如果用户在两个单个元素之间添加Empty集合,然后使用3个元素填充集合,则两个单个元素仍将位于新添加的3个元素之前和之后。
当然,我可以通过继承集合并定义所有这些行为来实现这一点,但是它很棘手,因为你需要保留添加的IEnumerable中的项目数量(IEnumerable没有计数) ),以及它在集合中的起始索引。我想到的第一件事是使用链接列表作为内部集合,因为你将调整很多,但我不确定什么是最好的。
然而,如果有更简单的方法来做到这一点而不是从头开始实现整个事情。使用现有的.NET FrameWork元素我想知道!因为这是我的问题的目的。
总结一下: 我正在寻找实现FlatCollection的最佳性能和最简单的方法,可能使用.NET FW元素。
答案 0 :(得分:1)
这看起来像某种树结构。每个"集合"是节点,每个节点可以有任意数量的子节点,值是叶子。通过仅仅通过离开顺序,您可以创建" flat"你想要的收藏。它也可以递归地工作,因此您可以询问任何节点,它将为您提供正确的"平面子集合"。
答案 1 :(得分:0)
Enumerable.SelectMany如果你的“扁平收藏”简单List<IEnumerable<T>>
,可能只需要你所需要的一切。
List<IEnumerable<MyItemType>> listOfEnumerables = new ...
IEnumerable<List<MyItemType>> flattened =
listOfEnumerables.Select(x => x);
如果要隐藏详细信息,也可以将该调用包装在类中:
class FlatCollection<T> : IEnumerable<T>
{
List<IEnumerable<T>> list = new ...
public Add(T item) { list.Add(Enumerable.Repeat(item, 1);}
public Add(IEnumerable<T> item) { list.Add(item);}
// use Enumerable.SelectMany to imeplent IEnumerable
}