2011-08-17 115 views
3

我有以下代码:如何在VB.NET中使用泛型?

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 

它列表转换为打印字符串。现在它被设置为与只是列表。我觉得它应该能够处理任何类型的集合。我是Collections和泛型的新手。当我试图做类似

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 

我得到一个错误。任何人都可以将我指向正确的方向吗?

+0

你得到的错误是什么? – shashi

+0

你得到了什么错误? –

+0

'错误数组边界不能出现在类型说明符中.' – user489041

回答

4

您没有从编译器获得非常有用的错误消息。您忘了将该功能设为通用的,它不能产生正确的诊断结果。让我们专注于更大的问题:

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),就是这样解决了您原始的错误消息之一。

3

​​应该是IEnumerable(Of T)

更新 BTW,顺便说一句,只要你想从你收集的对象只是ToString,并且ToStringObject类中定义的所有其他类继承Object,你可以只使用

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

它好像是这样,让我测试一下 – user489041

+0

这是你给出的最好的选择您的目标是使您的功能适用于各种各样的收藏。 'IEnumerable(of T)'适用于大多数(所有?)集合类,包括数组。 – Roger

+0

@ user489041我不确定,但我认为你必须添加(Of T)到函数声明中,就像'Daniel A. White' [建议](http://stackoverflow.com/questions/7093936/泛型在-VB网/ 7093978#7093978)。无法确定,从未亲自尝试过。 – J0HN

2

您需要在方法签名上指定通用。

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

编辑我改变了它。

+0

我给了这个镜头,它给了我一个错误Microsoft.VisualBasic.Collection没有类型参数,所以不能有类型参数。它具有在'Collection(Of T)' – user489041

+0

@ user489041 - 下更新的下划线。使用通用的'ICollection'。 –

+0

'ICollection'是'IEnumerable'的后代类,'IEnumerable'适用于该任务,因此不需要使用'ICollection'。 – J0HN

2

相同的解决方案,但与代码多亏少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 
+0

编辑:增加了一个版本与String.Join –

1

Hans's answer的缩写版本,扩展方法代替显式的For Each循环:

Public Function GetListAsString(Of T)(ByVal data As IEnumerable(Of T)) As String 
    Return data.Aggregate("| ", Function(d, s) d & s.ToString & " |") 
End Function 

但是你有没有尝试过Snowbear的建议?

"| " & String.Join(" | ", data) & " |" 

String.Join代码确实给从你的问题的代码稍有不同的行为,但它是如此简单。以下是区别

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

真棒,谢谢! – user489041

+0

阅读更多关于String.Join的[post](http://blackrabbitcoder.net/archive/2011/09/08/c.net-little-wonders-the-string-split-and-join-methods.aspx )在James Michael Hare的优秀博客上 – MarkJ