我正在实现一个带有通用LinkedList的undo/redo缓冲区.
在这种状态下:
[Top]
state4(撤消)
state3(撤消)
state2 < - 当前状态
state1
[bottom]
当我执行Push时,我想删除当前状态之后的所有状态,并推送新状态.
我目前的旁路是做,while (currentState != list.last), list.removeLast();
但它很糟糕
LinkedList只支持Remove,RemoveFirst和removeLast ...
我想要像RemoveAllNodesAfter(LinkedListNode ...)这样的东西?
如何在不迭代所有节点的情况下很好地编码?也许有扩展?...
我在标准中看不到任何LinkedList
可以让你这样做的东西.如果需要,您可以查看PowerCollections和C5集合 - 或者只是滚动您自己的LinkedList
类型.它是要实现的更简单的集合之一,特别是如果您可以"及时"方式添加功能.
如果我自己实现这个,我会选择一种不同的方式来实现它.
而不是.RemoveAllNodesAfter(node)
方法,我会选择创建一个.SplitAfter(node)
方法,返回一个新的链表,从下一个节点开始node
.这将成为一种更方便的工具,而不仅仅是能够切断尾部.如果你想要你的RemoveAllNodesAfter
方法,它只需要在SplitAfter
内部调用方法并丢弃结果.
天真的实施:
public LinkedListSplitAfter(Node node) { Node nextNode = node.Next; // break the chain node.Next = null; nextNode.Previous = null; return new LinkedList (nextNode); } public void RemoveAllNodesAfter(Node node) { SplitAfter(node); }