【问题标题】:How can I retrieve previous value of a variable?如何检索变量的先前值?
【发布时间】:2015-12-20 20:47:52
【问题描述】:

如何检索变量的先前值? 考虑到这一点:

Int x = 0;
x = 5; 
x = 10; 

如何检索 x 的两个旧值?

【问题讨论】:

  • 你不能。如果您需要记住它们,则需要在更改 x 的值之前将它们存储在某个位置。

标签: c#


【解决方案1】:

如何检索变量的先前值?

您可能需要 Stack。堆栈是您只能从一侧添加(推送)和删除(弹出)项目的结构。

Stack<int> x = new Stack<int>();
x.Push(0); // push first value
x.Push(5); // second value after first value
x.Push(10); //...

现在你有 10 个在堆栈的顶部。你可以向后移动。

var value = x.Pop(); // 10
var pre = x.Pop();   // 5
var prePre = x.Pop();// 0

请注意,如果堆栈为空,Pop 将抛出异常。也可以使用 Peek 从堆栈顶部获取项目而不删除它。

var value = x.Peek(); // 10
var value2 = x.Peek();// still 10

请注意,Stack 在内部使用数组。

【讨论】:

    【解决方案2】:

    我会把它们放在一个列表中。

    var values = new List<int>();
    
    int x = 0;
    values.Add(x);
    x=5;
    values.Add(x);
    x=10;
    values.Add(x);
    

    【讨论】:

      【解决方案3】:

      很简单。

      List<int> iList = new List<int>();
      iList.Add(10);
      iList.Add(20);
      

      ...

      然后你可以简单地得到它:

      iList.ElementAt(0);
      iList.ElementAt(1);
      

      iList.Last();
      iList.First();
      

      甚至:

      iList.Where(x => x > 5).First();
      

      【讨论】:

        【解决方案4】:

        您需要将它们定义为单独的变量。 int var1、int var2 等...

        【讨论】:

        • 不,这不是一个好方法。请让我知道给定问题是否存在可能的解决方案...
        • 我的导师问我,他说可以通过与指针有关的东西......我不知道......
        • 指针只保存一个值的地址。但是您希望访问其中至少三个。因此,就像其他人所说的那样,您必须将它们保存在某种存储、列表或数组或类似的东西中。可能,他在想一个指向值数组的指针?
        • @AmirMahdiHosseini 您的导师错了,无法“撤消”对变量的更改。您需要将以前的值存储在某处,例如 kevindeleon 建议的,或者使用其他人建议的集合。
        【解决方案5】:

        一旦值被重新分配,您将无法跟踪变量。您将不得不创建更多变量。像这样的:

        var x = 0;
        var x1 = 5;
        var x2 = 10;
        

        根据您的逻辑,分配或获取您需要的值。

        【讨论】:

          【解决方案6】:

          它是局部变量和字段的一般属性之一。值类型和引用类型没有区别。您的变量包含它们的值(或指向堆上值的指针)。

          当您使用赋值运算符“=”时,您实际上是在替换变量上的值。对于value types,您无法获取先前的变量,因为每个赋值都会创建新变量。对于reference types 赋值,只需替换指向该值的指针,然后如果您保存指向它们的指针,则可以检索您的旧值。

          boxing and unboxing 有特殊情况。

          您的问题的答案很简单:您可以在新分配之前保存以前的值。上面的答案用新变量实现了最简单的方法:

          var x = 0;
          var x1 = 5;
          var x2 = 10;
          

          如果您不知道代码中有多少分配,您可以实现最简单的历史记录集合。

          List<int> xHistoy = new List<int>(); // Or Queue<int>
          int x;
          private int AssignWithHistory(int val)
          {
              xHistory.Add(val);
              return x;
          }
          
          x = AssignWithHistory(0);
          x = AssignWithHistory(5);
          x = AssignWithHistory(10);
          

          但我认为主要目标不是实现您的场景,而是了解变量的原理及其在内存中的存储。

          【讨论】:

            【解决方案7】:

            您可以执行以下操作:

                private int _x;
            
                private int X
                {
                    get { return _x; }
                    set
                    {
                        _x = value;
            
                        if (XHistory == null)
                        {
                            XHistory = new List<int> {_x};
                        }
                        else
                        {
                            XHistory.Insert(0, _x);
                        }
                    }
                }
            
                private List<int> XHistory { get; set; }
            
                private void ShowHistoryOfX() => XHistory?.ForEach(Console.WriteLine);
            

            每次您为 X 赋值时,它都会添加到历史列表中,然后您可以将其打印出来。最近的更改将插入到列表的开头。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-11
              • 1970-01-01
              • 1970-01-01
              • 2016-02-14
              相关资源
              最近更新 更多