Search code examples
c#.netstackclone

How to clone a Stack<T>


I have few stacks in my code that I use to keep track of my logical location. At certain times I need to duplicate the stacks, but I can't seem to clone them in such way that it preserves the order. I only need shallow duplication (references, not object).

What would be the proper way to do it? Or should I use some other sort of stacks?

I saw this post Stack Clone Problem: .NET Bug or Expected Behaviour?, but not sure how to setup clone method for the Stack<T> class.

I use System.Collection.Generic.Stack<T>.


Solution

  • var clonedStack = new Stack<T>(new Stack<T>(oldStack));
    

    You can write this as an extension method as

    public static Stack<T> Clone<T>(this Stack<T> stack) {
        Contract.Requires(stack != null);
        return new Stack<T>(new Stack<T>(stack));
    }
    

    This is necessary because the Stack<T> constructor that we are using here is Stack<T>(IEnumerable<T> source) and of course when you iterate over the IEnumerable<T> implementation for a Stack<T> it is going to repeatedly pop items from the stack thus feeding them to you in reverse of the order that you want them to go onto the new stack. Therefore, doing this process twice will result in the stack being in the correct order.

    Alternatively:

    var clonedStack = new Stack<T>(oldStack.Reverse());
    
    
    public static Stack<T> Clone<T>(this Stack<T> stack) {
        Contract.Requires(stack != null);
        return new Stack<T>(stack.Reverse());
    }
    

    Again, we have to walk the stack in the reverse order from the output from iterating over the stack.

    I doubt there is a performance difference between these two methods.