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