然而,我正在考虑应该用作历史记录的集合,
许多人使用堆栈,但是C#堆栈是作为数组实现的,这是一个问题: 如果我使用“有限”的历史记录(例如,对于2000个命令),当达到限制时,我没有办法从堆栈的末尾删除项目,如果我找到一种方法来做到这一点,我必须移动数组的所有元素(每次执行命令都要这样做)。
LinkedList看起来不错,但浪费了很多内存。
我的最后选择是自定义SingleLinkedList的实现。 此列表的节点包括Value属性和NextNode指针属性,因此对于每个项目,我使用了双倍的内存(但除了使用小于“sizeof(void*)”的内容之外,没有更多)。
我还在集合中存储对第一个元素和最后一个元素的指针。
我可以轻松地将命令添加到历史记录中,并以这种方式将它们移动到redohistory中,但是我无法创建“有限”的历史记录,因为不允许RemoveLast(我必须遍历整个集合以删除最后一个项目)。
所以我的问题是: 我应该使用LinkedList还是我的自定义SingleLinkedList?
更新1:
谢谢目前的答案,在我的情况下,我没有内存问题,好吧,我不知道我在针对谁,我正在创建一个实用程序,并且在我的“实用程序”概念中,它们应该尽可能地浪费最少的cpu /内存(显然不要告诉我“写成c ++”,因为有很大的区别)。
在我看来,单链表效果很好,我真的不喜欢限制历史记录,我在考虑Photoshop,您的历史记录是“无限制”的。
我只担心当撤消历史记录变得非常大时会发生什么,例如使用8小时。 这就是为什么我考虑通过LinkedList限制它的原因。
正如其他人所述,如果我将LinkedList限制在一个大型大小左右,约为60000个命令(我认为它们应该足够),那么与singlelinkedlist相比,我只浪费了很少的内存(4字节* 60000)。
话虽如此,我想我会使用LinkedList,但是为了确保,如果我使用无限制的历史记录,那也可以吗?
更新2:
@ Akash Kava 好吧,你说的很重要,但你误解了我为什么想使用LinkedList以及为什么不想使用堆栈。堆栈的主要问题是必须限制其大小,并且在达到此限制时没有快速删除旧命令的方法(它是一个数组,每次将其维度加倍并不是我们想要的)。
一个单向链表(考虑如何构建)像栈一样快(所有栈操作都是O(1)),而且没有限制。然而在这种情况下,需要不设限制,否则我们会有和栈相同的问题,我们没有快速地删除我们单向链表的最后一个元素(它行为像一个栈),因为我们不知道最后一个节点的前一个节点元素。
在这种情况下,思考具有Previous指针的LinkedList就很容易了。
然而,对于我们“堆栈”(这次是通过链表构建的)的每个元素,我们使用2个额外的指针,这就像使用比存储Command所需内存多3倍的内存(使用数组我们可以获得普通的内存使用,单向链表的内存使用量是2倍,而LinkedList的内存使用量是3倍)。
所以,我基本上询问的是,实现撤销-重做模式的“最佳”集合是什么。
你的答案让我想到,即使我在一个程序中创建了60000个命令,它也只占用程序中约5MB的内存,这并不算太多。
基本上,如果你想限制你的撤消/重做历史记录,你需要使用LinkedList,否则SingleLinkedList更好。