【问题标题】:Values don't leave the stack after Pop (Stack<T>)弹出后值不离开堆栈 (Stack<T>)
【发布时间】:2020-06-01 07:55:14
【问题描述】:

堆栈由分组的列表组成。然后有几个调用Pop 的foreachs。 但是堆栈中的值的数量并没有减少。 请解释原因。提前谢谢!

    public static void N(){
    var test = new List<int>(){1,1,1,2,2,3,3,3,3,4,4,5,6,7,7,7,7,8};
    var testGr = test.GroupBy(x=>x);

    var stacked = testGr.Select(x=> new {
        num = x.Key,
        stack = new Stack<int>(x)
    });

    var testNumOne = stacked.First(x=>x.num==1);        
    Console.WriteLine(testNumOne.stack.Count());

    foreach(var x in new List<int>(){1,2,1,2,3}){
        var flush = stacked.First(y => y.num == x).stack.Pop();
    }

    testNumOne = stacked.First(x=>x.num==1);        
    Console.WriteLine(testNumOne.stack.Count());
}

【问题讨论】:

  • LINQ 实际上是一个视图。你的堆栈是一个投影。每次迭代 stacked 时,都会从 test 创建一个新堆栈。
  • 同样在stack = new Stack&lt;int&gt;(x.Select(t=&gt;t).ToList())你不需要.Select(t=&gt;t)new Stack&lt;int&gt;(x.ToList())应该足够了。
  • new Stack&lt;int&gt;(x) 应该足够了。它需要一个IEnumerable&lt;T&gt;,这就是x
  • @GuruStron 其实ToList()也是多余的;它应该只是new Stack&lt;int&gt;(x)
  • @Genka 您的编辑不会改变问题。每次调用stacked.First(),您都在创建一个 Stack

标签: c# list generics stack


【解决方案1】:

“stacked”的副本解决问题(通过stacked.ToList())

public static void Main()
{  
    var test = new List<int>(){1,1,1,2,2,3,3,3,3,4,4,5,6,7,7,7,7,8};
    var testGr = test.GroupBy(x=>x);

    var stacked = testGr.Select(x=> new {
        num = x.Key,
        stack = new Stack<int>(x)
    });
    var stackedCopy = stacked.ToList();
    var testNumOne = stackedCopy.First(x=>x.num==1);        
    Console.WriteLine(testNumOne.stack.Count());

    foreach(var x in new List<int>(){1,2,1,2,3}){
        var flush = stackedCopy.First(y => y.num == x).stack.Pop();
    }

    testNumOne = stackedCopy.First(x=>x.num==1);        
    Console.WriteLine(testNumOne.stack.Count());
}

我已经在学习 Linq 库如何处理内存。非常感谢大家!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多