【发布时间】: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<int>(x.Select(t=>t).ToList())你不需要.Select(t=>t),new Stack<int>(x.ToList())应该足够了。 -
new Stack<int>(x)应该足够了。它需要一个IEnumerable<T>,这就是x。 -
@GuruStron 其实
ToList()也是多余的;它应该只是new Stack<int>(x)。 -
@Genka 您的编辑不会改变问题。每次调用
stacked.First(),您都在创建一个新Stack。