如何在VB.NET中使用泛型?

如何在VB.NET中使用泛型?,.net,vb.net,generics,.net,Vb.net,Generics,我有以下代码: Public Shared Function GetListAsString(ByVal data As List(Of String)) As String Dim retVal As String = "| " For Each obj As String In data retVal = retVal + obj.ToString() + " |" Next Return retVal End Function 它将列表转换

我有以下代码:

Public Shared Function GetListAsString(ByVal data As List(Of String)) As String
    Dim retVal As String = "| "
    For Each obj As String In data
        retVal = retVal + obj.ToString() + " |"
    Next
    Return retVal
End Function
它将列表转换为可打印的字符串。现在,它被设置为只处理列表。我觉得它应该能够处理任何类型的收藏。我不熟悉集合和泛型。当我尝试做类似的事情时

Public Shared Function GetListAsString(ByVal data As Collection(T)) As String
    Dim retVal As String = "| "
    For Each obj As String In data.ToString()
        retVal = retVal + obj.ToString() + " |"
    Next
    Return retVal
End Function
我犯了一个错误。有人能给我指出正确的方向吗?

集合(T)
应该是
IEnumerable(Of T)

更新顺便说一句,顺便说一句,只要您想从集合对象中继承
ToString
,并且
ToString
在类
Object
中定义,并且所有其他类继承
Object
,您就可以使用

Public Shared Function GetListAsString(ByVal data As IEnumerable(Of Object)) As String

您需要在方法签名上指定泛型

Public Shared Function GetListAsString(Of T)(ByVal data As ICollection(Of T)) As String

编辑我更改了它。

您没有从编译器获得非常有用的错误消息。您忘了将函数设置为泛型,它无法生成适当的诊断。让我们关注更大的问题:

    For Each obj As String In data.ToString()
        retVal = retVal + obj.ToString() + " |"
    Next
For循环已中断,从data.ToString()开始。只需使用数据。数据的元素类型是T,而不是String。此外,由于您仅枚举集合,因此可以使用较小的接口IEnumerable,使其可以处理更多的集合类型。因此:

Public Shared Function GetCollectionAsString(Of T)(ByVal data As IEnumerable(Of T)) As String
    Dim retVal As String = "| "
    For Each obj As T In data
        retVal = retVal + obj.ToString() + " |"
    Next
    Return retVal
End Function

请注意,在函数名之后添加了
(Of T)
,这是解决原始错误消息的方法。

由于VB.Net推理的魔力,使用相同的解决方案,但代码更少:

Public Shared Function GetListAsString(Of T)(ByVal data As IEnumerable(Of T)) As String
    Dim retVal = "| "    
    For Each obj In data
        retVal &= obj.ToString + " |"
    Next
    Return retVal
End Function
编辑

或者更简单地使用String.Join

Public Shared Function GetListAsString(Of T)(ByVal data As IEnumerable(Of T)) As String
    Return "| " & String.Join(" |", data) & " |"
End Function
的缩短版本,每个循环都有一个扩展方法来代替显式的

Public Function GetListAsString(Of T)(ByVal data As IEnumerable(Of T)) As String
    Return data.Aggregate("| ", Function(d, s) d & s.ToString & " |")
End Function
但是你有没有试过从评论中得到雪熊的建议

"| " & String.Join(" | ", data) & " |"
这个
String.Join
代码确实给出了与您问题中的代码稍有不同的行为,但它非常简单。这里是不同之处

empty-sequence -> "| |" rather than "| "
1, 2 -> "| 1 | 2 |" rather than "| 1| 2 |" (was that really what you meant?)

您得到的错误是什么?
error 1数组边界不能出现在类型说明符中。
您使用哪个.Net Framework版本
string.Join(“|”,list)
已经执行了您想要的操作,至少在.Net Framework 4.0I中是这样,它给了我一个错误Microsoft.VisualBasic.Collection没有类型参数,因此不能有类型参数。它在
Collection(Of T)
ICollection
中带下划线的T是
IEnumerable
的后代类,
IEnumerable
适合该任务,因此无需使用
ICollection
。当然,但他在最初的帖子中使用了
Collection
。看起来是这样的,让我来测试一下,这是你最好的选择,因为你的目标是让你的函数能够与最广泛的集合一起工作
IEnumerable(of T)
适用于大多数(all?)集合类,包括数组。@user489041我不确定,但我认为您必须将(of T)添加到函数声明中,如
Daniel A.White
。无法确定,从未亲自尝试过。编辑:添加了一个带有String.Join的版本阅读有关String的更多信息。请在James Michael Hare的优秀博客上加入