有没有一种聪明的方法来复制堆栈(的..)



在 vb.net 中,我正在尝试创建一个扩展来复制/反转/合并堆栈。 请注意,它可能已经存在,但我面临一个问题。

我有一个名为实用程序的模块.vb它包含一大堆<Extension((>,就像我正在尝试编写的副本一样。

''' <summary>
''' Duplicate a stack of object to another
''' </summary>
''' <typeparam name="T">Object type in the stack</typeparam>
''' <param name="s">Stack to duplicate</param>
''' <returns></returns>
<Extension()>
Public Function Duplicate(Of T)(ByVal s As Stack(Of T())) As Stack(Of T())
Dim tmp As New Stack(Of T())
For i As Integer = s.Count - 1 To 0 Step -1
tmp.Push(s(i))
Next
Return tmp
End Function

我正在一个名为labelStack的堆栈中进行各种数量的推送。但是当我从我的代码调用 Duplicate 函数时(因为我需要多次重用同一个堆栈(,它没有编译(请注意,堆栈是由自己创建的对象类组成的(

Dim summaryStack As Stack(Of CCNode) = labelStack.Duplicate()

错误是"'重复'不是'堆栈(MyForm.CCNode('的成员">

我还尝试更改扩展程序的签名,如下所示:

Public Function Duplicate(Of T As {New})(ByVal s As Stack(Of T())) As Stack(Of T())

但没有任何成功。

有人可以帮助我(指出我的错误,纠正它或给我一种方法来实现我的需求,而无需自己编写函数(?

PS:我正在使用堆栈,因为我需要以与推送相反的顺序弹出,这似乎很合适。

你做错了。如果你想重用或反转或任何类似的东西,那么你不应该创建一个Stack(Of T)开始。创建一个数组或一个List(Of T),具体取决于您是否希望能够调整内容,然后您可以从中创建任意数量的Stack(Of T)Queue(Of T)对象。这两个类都有一个接受IEnumerable(Of T)作为参数的构造函数,因此您可以将数组或List(Of T)传递给任意数量的构造函数,例如

Dim items = {1, 2, 3, 4}
Dim s1 As New Stack(Of Integer)(items)
Dim s2 As New Stack(Of Integer)(items.Reverse())
Dim q1 As New Queue(Of Integer)(items)
Dim q2 As New Queue(Of Integer)(items.Reverse())

也就是说,我只是这样做了:

Imports System.Runtime.CompilerServices
Public Module StackExtensions
<Extension>
Public Function Copy(Of T)(source As Stack(Of T)) As Stack(Of T)
Dim newStack As New Stack(Of T)
For Each item In source.Reverse()
newStack.Push(item)
Next
Return newStack
End Function
End Module

它完全按照您想要的方式工作。我希望在此之后输入堆栈为空,因为我认为枚举Stack(Of T)会弹出每个项目,但显然并非如此。

实际上,我刚刚意识到这意味着Stack(Of T)构造函数将接受另一个Stack(Of T)作为参数,这使得扩展方法更加简单:

Imports System.Runtime.CompilerServices
Public Module StackExtensions
<Extension>
Public Function Copy(Of T)(source As Stack(Of T)) As Stack(Of T)
Return New Stack(Of T)(source.Reverse())
End Function
End Module

这太简单了,我认为扩展方法甚至不值得打扰。

综上所述,我仍然会将数组或List(Of T)作为单一事实来源,并从中创建所有堆栈。这样,在创建所需的所有副本之前,您就不可能弹出一个项目。

相关内容

  • 没有找到相关文章

最新更新