Как сделать эту простую функцию общей в VB.NET? - PullRequest
0 голосов
/ 29 июля 2011

Цель достижения:

Я хочу, чтобы функция принимала 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 ... и не очень разбираюсь в общих функциях!

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Вам даже не нужно писать новую функцию для этого. Просто используйте .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 голос
/ 29 июля 2011

Обновление : Если вам нужна функция, которая может принимать или 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...