0

目标实现:

我希望函数接受 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 的新手.. 对泛型函数不太了解!

4

2 回答 2

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

请注意,所有这些 return IEnumerable(Of String),这就是它应该的样子。稍后将其转换为字符串数组或字符串列表很容易,但大多数时候您不想这样做。尽可能长时间地将对象视为 IEnumerable 对性能来说要好得多。

于 2011-07-29T03:08:55.087 回答
1

更新:如果您想要的是一个可以采用 a 或数组的函数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)

请注意,虽然这似乎可以实现您所追求的,但它实际上有点灵活,因为它需要您以上面的形式(每个单独)或作为实际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
于 2011-07-29T02:04:33.523 回答