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)
为什么会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)构造函数将给定序列的元素按元素在序列中出现的顺序推入堆栈。因此,旧堆栈顶部的元素变为新堆栈底部的元素。
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |