【发布时间】:2014-11-30 01:33:36
【问题描述】:
我需要一种数据类型,它实现了 IEnumerable 接口,但也允许在恒定时间内删除/插入任意数量的元素。
此外,数据类型必须允许对已知元素的恒定访问时间。基本上我需要的是一个实现 IEnumerable 的 C89 风格的双向链表。
我的一个要求是我不能多次迭代数据。
我考虑(并且正在努力)创建一个扩展 ArrayList 并实现 IEnumerable 接口的类,但我担心有一种更清洁或更好的方法。
这一切都是因为我正在处理的代码的输入变量之一是 IEnumerable 类型(我无法更改它)。
我的问题有两个:
- 有没有一种方法可以在不创建单独的类或迭代每个元素的情况下实现我所描述的功能?
- 如果对 1 的回答是否定的,那么在创建我所描述的类时我应该采取哪些广泛的步骤?
谢谢!
-------编辑-------
该算法的主要目标是根据特定标准(专有,因此没有代码,对不起!!!)将元素组合在一起。为此,该算法创建一个单独的列表,并且对于创建的每个“父”记录,复制(或(编辑)理想地移动,这更快!)由算法指定为父节点的子节点的记录。很抱歉对此没有更清楚;我昨晚在美国东部标准时间下午 2 点到 10 点工作。
【问题讨论】:
-
List<T>不是已经提供你想要的了吗? -
不,如果你看到hereList
.GetRange 需要n 时间来检索任意数量的元素;我将编辑问题以使该要求更清楚! :) -
如何拥有双向链表和恒定的元素访问时间?
-
Andrew,C89 将允许您直接移动下一个/上一个指针。即使您使用 sizeof 将指针移动到正确的位置,实现这是 C# 也需要使用 unsafe (请参阅我的答案)。此外,由于 C# LinkedList 没有 GetRange (并且不能,因为这将要求它跟踪索引)任何时候你想删除/复制 k 个元素,你必须使用 k 时间。对于整个列表,总和为 2N
-
我读到你的编辑是想创建从父节点到子节点的引用。这不需要移动 或 复制任何实际元素,只需添加引用(再次假设引用类型)。如果你回到双向链表领域,那么是的,你说的很有道理。我想我还没有完全理解这个问题——我知道代码是专有的,但是匿名的代码示例可能会澄清一些事情。
标签: c# performance algorithm inheritance multiple-inheritance