如何在VB.NET中使这个简单的函数通用?

时间:2011-07-29 02:00:18

标签: .net vb.net generics generic-programming

旨在实现:

我希望函数接受List(Of String),Array&字符串和类似的返回List(Of String),Array&字符串分别。函数只是将一个字符串(月)添加到输入集合。我只想将它用于字符串,数组和列表,需要考虑转换。

我有一个简单的功能:

Private Function addMonth(ByVal stringList As List(Of String), ByVal month As String) As List(Of String)
    Dim names As New List(Of String)
    For Each name In stringList
        names.Add(name + " (" + month + ")")
    Next name
    Return names
End Function

如何使用通用类型'T'来实现我的目标?

这真的会让我感到很紧张..!

我是VB.Net的新手..并且对通用函数了解不多!

2 个答案:

答案 0 :(得分:3)

您甚至不需要为此编写新功能。只需使用.Select()

myStringList.Select(Function(s) s & " (" & month & ")")

但是既然你也想接受字符串输入,你可以像这样重载函数:

Private Function AddMonth(ByVal list As IEnumerable(Of String), ByVal month As String) As IEnumerable(Of String)
    return list.Select(Function(s) s & " (" & month & ")")
End Function

Private Function AddMonth(ByVal list As String, ByVal month As String) As IEnumerable(Of String)
   Return New String() {list & " (" & month & ")"}
End Function

请注意,所有这些都返回IEnumerable(Of String),这应该是正确的。稍后将其转换为字符串数组或字符串列表很容易,但大多数时候您不想这样做。对于性能来说,尽可能长时间地将对象作为IEnumerable进行处理会更好。

答案 1 :(得分:1)

更新:如果你想要的是一个可以 String String()的功能数组,您可以使用ParamArray关键字完成此操作。但它需要是传递给函数的 last 参数;所以你只需要颠倒参数的顺序:

Private Function AddMonth(ByVal month As String, ByVal ParamArray list() As String) As List(Of String)
    ' Same code as below
End Function

这可以让你像这样调用它:

Dim withMonths = AddMonth("March", "Report")

也是这样:

Dim withMonths = AddMonth("March", "Report", "Memo")

也是这样:

Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)

请注意,虽然这看起来可以实现您所追求的目标,但它实际上有点灵活,因为它要求您以上面的形式(每个单独)或实际传递参数String()数组,而不仅仅是IEnumerable(Of String)等任何List(Of String)


原始回答

Private Function AddMonth(Of T)(ByVal list As IEnumerable(Of T), ByVal month As String) As List(Of String)
    Dim names As New List(Of String)
    For Each name In list
        ' Using String.Concat avoids the possibility
        ' of a NullReferenceException
        names.Add(String.Concat(name) + " (" + month + ")")
    Next name
    Return names
End Function