如何使用堆栈的反向方法?

Ele*_*ios -1 .net linq vb.net stack types

我需要使用该Reverse方法反转堆栈的顺序。

但是我已经尝试过了,但是它不起作用:

    Dim StackObject As New Stack(Of String)
    StackObject.Push("S")
    StackObject.Push("T")
    StackObject.Push("A")
    StackObject.Push("C")
    StackObject.Push("K")

    StackObject = StackObject.Reverse.Cast(Of String)() ' <-- InvalidCastException

    For Each str As String In StackObject
        MsgBox(str)
    Next
Run Code Online (Sandbox Code Playgroud)

我编写了这个通用函数来反转堆栈,但是我想使用Reverse方法而不是所有这些不必要的代码来做到这一点:

Private Function Reverse_Stack(Of T)(stack As Stack(Of T))

    Dim new_stack As New Stack(Of T)

    While Not stack.Count = 0
        new_stack.Push(stack.Pop)
    End While

    Return new_stack

End Function
Run Code Online (Sandbox Code Playgroud)

Mic*_*Liu 5

为什么会StackObject = StackObject.Reverse().Cast(Of String)()引发异常?

反向是LINQ扩展方法,在这种情况下,它返回一个IEnumerable(Of String)(顺便说一句,意味着Cast(Of String)多余),因此您不能直接将结果分配给type变量Stack(Of String)

您可以使用Option Strict语句在编译时而不是运行时捕获此错误。

那么,我该如何逆转Stack(Of T)

只需使用带有的Stack(Of T)构造函数,即可将IEnumerable(Of T)其堆栈反转:

Private Function Reverse_Stack(Of T)(stack As Stack(Of T)) As Stack(Of T)
    Return New Stack(Of T)(stack)
End Function
Run Code Online (Sandbox Code Playgroud)

您甚至可以将其作为扩展方法,以取代LINQ Reverse

<Extension>
Public Function Reverse(Of T)(stack As Stack(Of T)) As Stack(Of T)
    Return New Stack(Of T)(stack)
End Function
Run Code Online (Sandbox Code Playgroud)

现在,您可以编写StackObject = StackObject.Reverse()而不会出现错误。

这是如何运作的?

Stack(Of T).GetEnumerator()以将它们从堆栈中弹出的顺序返回元素,并且Stack(Of T)构造函数将给定序列的元素按元素在序列中出现的顺序推入堆栈。因此,旧堆栈顶部的元素变为新堆栈底部的元素。