簡単なUndo Redo

もっとも簡単なUndo,Redo。
xmlをstring型でStackしていく方法で、速度の問題はこれからだが基本これで大丈夫。

private readonly Stack<string> _undo = new();  // 状態の履歴(最新がトップ)
private readonly Stack<string> _redo = new();  // 戻した状態の退避

public void Do()
{
var doc = new XmlDocument();

SaveXml(doc);

_undo.Push(doc.OuterXml);
_redo.Clear();
}

public void Undo()
{
if (_undo.Count() == 0)
{
return;
}

if (_undo.Count() == 1)
{
var first = _undo.Pop(); // 現在の状態を取り出し
_redo.Push(first); // Redo 用に退避
Clear();
return;
}

var current = _undo.Pop(); // 現在の状態を取り出し
_redo.Push(current); // Redo 用に退避
var previous = _undo.Peek(); // ひとつ前を適用
var doc = new XmlDocument();
doc.LoadXml(previous);
LoadXml(doc);
}

public void Redo()
{
if (_redo.Count() <= 0)
{
return;
}

var next = _redo.Pop(); // 現在の状態を取り出し
_undo.Push(next);
var doc = new XmlDocument();
doc.LoadXml(next);
LoadXml(doc);
}