2011-08-17 47 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