【问题标题】:Undo Operation fails on Repeated Use重复使用时撤消操作失败
【发布时间】:2016-01-20 09:05:13
【问题描述】:

我创建了一个撤消操作来将当前值设置为列表中的前一个值。它通过从列表中删除最近的索引并将值设置为其后面的值来完成此操作。目前,当初始化时列表中没有值时,以及列表中有多个值时,它都有效。

当数组中至少有一个索引时代码的工作方式,因为以前的单元测试通过了。

在列表中的最后一项也被删除之后,当命令运行两次时,我尝试让 InvalidOperationException 通过。所以 Add(5) -> Undo() -> Undo() 举个例子。同样将 if 语句从 valDict.Count > 0 更改为 Value > 0,也会出现同样的错误。

List<int> valDict = new List<int>();

 public void Undo()
    {
        repOp1 = "Undo";
        Console.WriteLine("1: " + valDict.Count);
        if ( valDict.Count > 0)
        {
            int temp = valDict.Count - 1;
            Console.WriteLine("2: " + temp);
            valDict.RemoveAt(temp);

            Console.WriteLine("3: " + valDict.Count);
            valDict.TrimExcess();
            //Below Line is flagged as the error
            Value = valDict[valDict.Count-1];
        }
        else
        {
           throw new InvalidOperationException();
        }

    }

有人可以用新的眼光看这个,指出一个可能的解决方案,但不是一个固定的实现,因为我需要自己修复实现。

【问题讨论】:

  • 我建议使用Stack&lt;T&gt; 来存储操作。您应该阅读 Stack 数据结构。
  • 您正在尝试索引列表中已删除的项目。当列表中有 1 项时 Kaboom。将 RemoveAt() 调用移至底部。
  • @Hans 啊,谢谢,现在可以使用了 :)
  • @Andrew 我会阅读它,以便在以后的版本中对其进行改进:)​​

标签: c# undo


【解决方案1】:

您可以在获取值之前控制您的 List 不为空:list.Count==0 或 !list.Any()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2013-09-21
    • 2012-10-03
    • 1970-01-01
    • 2012-06-22
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多