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

これらのすべてが返されることに注意し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 に答える