C# c linkedlist如何获取位于最后一个元素之前的元素的

C# c linkedlist如何获取位于最后一个元素之前的元素的,c#,linked-list,C#,Linked List,我尝试在windows窗体应用程序中实现重做撤消 我构建了一个linkedlist,列表中的每个条目都是一个类,用于保存表单中所有元素的状态 每次单击“保存”按钮,都会在此列表中插入表单元素的最后状态 当用户单击“撤消”按钮时,我希望在最后一个按钮之前获得列表的输入 然后加载它 我不知道在链表中的元素之前得到这个的简单方法是什么 我的代码看起来像: public class SaveState { public int comboBox1; publi

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

我构建了一个linkedlist,列表中的每个条目都是一个类,用于保存表单中所有元素的状态

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

当用户单击“撤消”按钮时,我希望在最后一个按钮之前获得列表的输入 然后加载它

我不知道在链表中的元素之前得到这个的简单方法是什么

我的代码看起来像:

 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);

您可以通过获取最后一个节点

请注意,这是一个,您需要使用属性获取T的底层实例


当然,您应该注意检查列表是否不为空,如果列表为空,则检查list.Last是否为空,如果列表为单元素列表,则检查list.Last.Previous是否为空。

您可以通过

请注意,这是一个,您需要使用属性获取T的底层实例


当然,您应该注意检查列表是否为空,如果列表为空,则list.Last不为空,如果列表为单元素列表,则list.Last.Previous不为空。

@Haim,您可能需要检查Krill Osenkov的。这使得撤销/重做非常容易。

@Haim,你可能想看看磷虾奥森科夫的。它使撤消/重做变得非常容易。

为什么不使用堆栈而不是链表?为什么不使用堆栈而不是链表?
// list is LinkedList<T> for some T
var last = list.Last;
var penultimate = last.Previous; // or list.Last.Previous;