Переопределить элементы списка (из строки) в подпрограмме - PullRequest
0 голосов
/ 13 декабря 2018

Следующий пример упрощен.В моем проекте у меня есть большой List(of String), где я должен сделать некоторые манипуляции со строками.Для этого я создал Sub, где я делаю манипуляции, и это должно переписать элементы List(of String).

Module Module1
    Sub Main()
        Dim myList As List(Of String) = New List(Of String)
        myList.Add("1Tom")
        myList.Add("2Lisa")
        'Now I want apply a function to the List. As an example I created one that removes the first Letteer
        RemoveFirstChar(myList)
        For Each str As String In myList
            Console.Write(str)
        Next
        Console.Read()
    End Sub

    Sub RemoveFirstChar(ByRef myList As List(Of String))
        For Each str As String In myList
            str = str.Substring(2)
        Next
    End Sub
End Module

Сама работа со строками внутри Sub работает, но она не записана в исходный List-Object.Я действительно думал, что использование ByRef сделает это.Можно ли сделать это таким образом, и я просто ошибаюсь, или мне нужно создать новый List(of String) с помощью функции и переопределить начальный объект.Как:

myList = foo(myList)

Если оба будут работать, что будет более эффективным?Поскольку я должен сделать это в Списке (Строк) с несколькими тысячами элементов.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

В этом коде:

For Each str As String In myList
    str = str.Substring(2)
Next

вы присваиваете результат ваших манипуляций str, а str является просто локальной переменной.Вы действительно должны поместить результат в List, что вы делаете, устанавливая свойство Item.Избавьтесь от этого ByRef, поскольку это красная сельдь.Просто используйте цикл For, например:

For I = 0 To myList.Count - 1
    myList(i) = myList(i).Substring(2)
Next
0 голосов
/ 13 декабря 2018

Вы должны использовать For -loop, вы не можете изменить строку с помощью For Each:

Sub RemoveFirstChar(ByRef myList As List(Of String))
    For i As Integer = 0 To myList.Count - 1
        Dim str As String = myList(i)
        myList(i) = str.Substring(2)
    Next
End Sub

Вы можете изменить объект For Each, но так как строки неизменяемыВы не можете изменить их, но вам нужно заменить их.Вы не можете заменить весь объект в For Each, следовательно, вам нужно For.

Но обратите внимание, что это удалит первые два символа (индексы равны нулю в .NET), а также не 't проверьте, равна ли длина строки> = 2. Так что это, похоже, то, что вам нужно:

myList(i) = If(str.Length >= 1, str.Substring(1), str)
...