覆盖 Sub 中的列表(字符串)元素

Override List(of String) Elements in a Sub

下面的例子被简化了。在我的项目中,我有一个很大的 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)

如果两者都有效,哪个更有效?因为我必须在一个只有几千个元素的列表(字符串)上执行此操作。

你必须使用 For 循环,你不能用 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 中索引为零)并且不会检查字符串长度是否 >= 2。所以这似乎是您需要的:

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

在此代码中:

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