实现动态FlatCollection <t> </t>

时间:2014-03-28 20:41:18

标签: c# algorithm data-structures collections

我需要创建或使用现有的.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元素。

2 个答案:

答案 0 :(得分:1)

这看起来像某种树结构。每个&#34;集合&#34;是节点,每个节点可以有任意数量的子节点,值是叶子。通过仅仅通过离开顺序,您可以创建&#34; flat&#34;你想要的收藏。它也可以递归地工作,因此您可以询问任何节点,它将为您提供正确的&#34;平面子集合&#34;。

答案 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
  }