-1

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

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
4

2 に答える 2

5

なぜStackObject = StackObject.Reverse().Cast(Of String)()例外をスローするのですか?

Reverseは LINQ 拡張メソッドであり、この場合は an を返しますIEnumerable(Of String)(ちなみに、これCast(Of String)は冗長であることを意味します)。そのため、結果を type の変数に直接代入することはできませんStack(Of String)

Option Strictステートメントを使用すると、実行時ではなくコンパイル時にこのエラーをキャッチできます。

では、どうすれば a を逆にすることができ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

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

これでエラーなく書き込めStackObject = StackObject.Reverse()ます。

これはどのように作動しますか?

Stack(Of T).GetEnumerator()スタックからポップされる順序で要素を返し、Stack(Of T)コンストラクターは、指定されたシーケンスの要素を、要素がシーケンスに表示される順序でスタックにプッシュします。したがって、古いスタックの一番上にある要素は、新しいスタックの一番下にある要素になります。

于 2013-11-03T17:07:00.030 に答える