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

如何使这个简单的函数在VB.NET中通用?,.net,vb.net,generics,generic-programming,.net,Vb.net,Generics,Generic Programming,实现目标: 我希望函数分别接受List(Of String)、Array和String以及类似地返回List(Of String)、Array和String。该函数只向输入集合添加一个字符串(月)。我只想将它用于字符串、数组和列表,需要考虑转换 我有一个简单的功能: Private Function addMonth(ByVal stringList As List(Of String), ByVal month As String) As List(Of String) Dim nam

实现目标:

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

我有一个简单的功能:

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的新手。。而且对泛型函数也不太了解

更新:如果您想要的是一个可以接受
String
String()
数组的函数,那么可以使用
ParamArray
关键字来完成。但它必须是传递给函数的最后一个参数;所以你只需要颠倒参数的顺序:

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)
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
也像这样:

Dim withMonths = AddMonth("March", "Report")
Dim withMonths = AddMonth("March", "Report", "Memo")
Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)
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
也像这样:

Dim withMonths = AddMonth("March", "Report")
Dim withMonths = AddMonth("March", "Report", "Memo")
Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)
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
请注意,虽然这似乎实现了您所追求的目标,但实际上灵活性稍差,因为它要求您以上述形式(每个单独)或实际的
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

更新:如果您想要的是一个可以接受
字符串
字符串()
数组的函数,则可以使用
ParamArray
关键字来完成。但它必须是传递给函数的最后一个参数;所以你只需要颠倒参数的顺序:

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)
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
也像这样:

Dim withMonths = AddMonth("March", "Report")
Dim withMonths = AddMonth("March", "Report", "Memo")
Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)
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
也像这样:

Dim withMonths = AddMonth("March", "Report")
Dim withMonths = AddMonth("March", "Report", "Memo")
Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)
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
请注意,虽然这似乎实现了您所追求的目标,但实际上灵活性稍差,因为它要求您以上述形式(每个单独)或实际的
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

您甚至不需要为此编写新函数。只需使用
。选择()

但是,由于您还希望接受字符串输入,因此可以像这样重载函数:

Dim withMonths = AddMonth("March", "Report")
Dim withMonths = AddMonth("March", "Report", "Memo")
Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)
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(字符串的)
,这与它应该的一样。稍后很容易将其转换为字符串数组或字符串列表,但大多数情况下您不想这样做。尽可能长时间地将对象视为IEnumerable对性能有好处。

您甚至不需要为此编写新函数。只需使用
。选择()

但是,由于您还希望接受字符串输入,因此可以像这样重载函数:

Dim withMonths = AddMonth("March", "Report")
Dim withMonths = AddMonth("March", "Report", "Memo")
Dim list = New String() { "Report", "Memo" }
Dim withMonths = AddMonth("March", list)
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(字符串的)
,这与它应该的一样。稍后很容易将其转换为字符串数组或字符串列表,但大多数情况下您不想这样做。尽可能长时间地将对象视为IEnumerable对性能有好处。

回答您的问题,再次冒着降低投票率的风险:)旧版本的VB在.net中使用的数据类型是Variant,它被ObjectIts取代了,不是这样的。。先生你可以回答。。我不会投反对票。。可能是巧合..回答您的问题,再次冒着降低投票率的风险:)旧版本的VB在.net中使用Variant的数据类型,它被objectit替换,而不是那样的。。先生你可以回答。。我不会投反对票。。也许是巧合让我试试,我会让你知道的!如何管理字符串作为此列表的输入?str.ToArray使其成为字符数组。。如何以最佳方式将str转换为字符串数组?@Yugal:如何将字符串转换为字符串数组?给出一个输入/输出的例子。。这将像一个月(“报告”。今天,“三月”)!!和。。“Report”.ToArray使其成为字符数组而不是字符串数组。我不想让它看起来很脏,那么你有什么建议?@Yugal Jindle:addMonth({“报告”},“三月”)让我试试,我会让你知道的!如何管理字符串作为此列表的输入?str.ToArray使其成为字符数组。。如何以最佳方式将str转换为字符串数组?@Yugal:如何将字符串转换为字符串数组?给出一个输入/输出的例子。。这将像一个月(“报告”。今天,“三月”)!!和。。“Report”.ToArray使其成为字符数组而不是字符串数组。我不想让它看起来脏兮兮的,那你有什么建议?@Yugal Jindle:addMonth({“Report”},“March”)我们可以把这两个函数合并成一个吗?通过使用泛型。。像T?这将非常有效。。但如果能以某种方式将它们合并,那就太好了!好。。太好了。。但是如果你能把这两个函数合并成一个函数并维护它,那就太棒了。我们能不能把这两个函数合并成一个呢?通过使用泛型。。像T?这将非常有效。。但如果能以某种方式将它们合并,那就太好了!好。。太好了。。但是如果你能将这两个函数合并成一个并维护它的功能,那就太棒了。