【问题标题】:c# linkedlist how to get the the element that is before the last elementc#linkedlist如何获取最后一个元素之前的元素
【发布时间】:2011-01-15 19:35:12
【问题描述】:

我尝试在我的 Windows 窗体应用程序中实现重做撤消。

我建立了一个链表,链表的每一个条目都是一个类,它保存了表单中所有元素的状态。

每次点击保存按钮,都会在此列表中插入表单元素的最后状态。

当用户单击撤消按钮时,我想获取列表的输入(最后一个之前) 并加载它。

我不知道从链表中获取元素之前的简单方法是什么?

我的代码如下所示:

 public class SaveState {

          public int comboBox1;
          public int comboBox2;
          ..........
          public SaveState() {
           .......
          }
    }
    LinkedList<SaveState> RedoUndo = new LinkedList<SaveState>();

    # in save function
    var this_state = new SaveState();           
    this_state = getAllState();
    RedoUndo.AddLast(this_state);

    # when click undo
    var cur_state = new SaveState();
    # this lines dont work !!!!!!!!!
    int get = RedoUndo.Count - 1;        
    cur_state = RedoUndo.Find(get);
    setAllState(cur_state);

【问题讨论】:

  • 为什么不使用堆栈而不是链表?

标签: c# linked-list


【解决方案1】:

您可以通过LinkedList&lt;T&gt;.Last获取最后一个节点

// list is LinkedList<T> for some T
var last = list.Last;

倒数第二个节点通过LinkedListNode&lt;T&gt;.Previous

var penultimate = last.Previous; // or list.Last.Previous;

请注意,这是一个LinkedListNode&lt;T&gt;,您需要使用LinkedListNode&lt;T&gt;.Value 属性获取T 的底层实例。

当然,您应该注意检查list 不为空,list.Last 不为空(在空列表的情况下),以及list.Last.Previous 不为空(在一个单元素列表)。

【讨论】:

    【解决方案2】:

    @Haim,您可能想查看 Krill Osenkov 的 Undo Framework。它使撤消/重做变得非常容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多