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

Vb.net 有没有一种聪明的方法来复制一堆(的…),vb.net,stack,compiler-services,Vb.net,Stack,Compiler Services,在vb.net中,我试图创建复制/反转/合并堆栈的扩展。 请注意,它可能已经存在,但我面临一个问题 我有一个名为utility.vb的模块,它包含了一大堆类似于我试图编写的副本的内容 ''' <summary> ''' Duplicate a stack of object to another ''' </summary> ''' <typeparam name="T">Object type in the stack</typeparam> '

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

我有一个名为utility.vb的模块,它包含了一大堆类似于我试图编写的副本的内容

''' <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
错误为“Duplicate”不是“StackOf MyForm.CCNode”的成员

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

Public Function Duplicate(Of T As {New})(ByVal s As Stack(Of T())) As Stack(Of T())
但是没有成功

有人能帮我指出我的错误,纠正它,或者给我一种方法来实现我的需要,而不必自己编写函数吗


注意:我使用Stack是因为我需要按与推送相反的顺序弹出,这似乎很合适。

你做得都不对。如果你想重复使用或反向使用或任何类似的东西,那么你不应该首先创建一个T堆栈。创建一个数组或一个列表T,这取决于您是否希望能够调整内容,然后您可以从中创建任意数量的StackOfT和QueueOfT对象。这两个类都有一个构造函数,它接受IEnumerableOf T作为参数,因此您可以将数组或ListOf T传递给任意数量的构造函数,例如

Dim项={1,2,3,4} 将s1作为新的整数堆栈 尺寸s2为新的整数堆栈。反向 Dim q1作为整数项的新队列 Dim q2作为整数项的新队列。反向 也就是说,我只是这样做了:

导入System.Runtime.CompilerServices 公共模块堆栈扩展 公共函数CopyOf Tsource As StackOf T As StackOf T 暗淡的新闻图钉作为新的T堆 对于源代码中的每个项目。反向 新闻标题 下一个 返回新闻标题 端函数 端模块 它完全按照你想要的那样工作。我希望输入堆栈在此之后为空,因为我认为枚举一个T堆栈会弹出每个项,但显然不是这样

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

导入System.Runtime.CompilerServices 公共模块堆栈扩展 公共函数CopyOf Tsource As StackOf T As StackOf T 返回Tsource的新堆栈。反向 端函数 端模块 这是如此简单,以至于我认为扩展方法甚至不值得费心


尽管如此,我仍然会使用数组或列表T作为唯一的真理来源,并从中创建所有堆栈。这样,在创建所需的所有副本之前,您不可能弹出一个项目。

根据您的方法声明,您需要传入一个t数组堆栈,然后返回一个t数组堆栈。我怀疑这是您想要的。如果我理解您的要求,请参阅我的答案以获得正确的声明。我习惯于列出。。。但永远不能确定它是否会保持我添加元素的顺序。我要看一看。。。也是,但当我需要后进先出的时候是先入先出。无论如何,学习一个新的容器总是很有趣的,因为您可以通过索引访问T列表中的项目,所以可以确保顺序保持一致。我刚才提到队列是因为它的工作原理类似,而不是因为在这种情况下您必须使用它。
Public Function Duplicate(Of T As {New})(ByVal s As Stack(Of T())) As Stack(Of T())