首页 > 解决方案 > 覆盖 Sub 中的 List(of String) 元素

问题描述

下面的例子被简化了。在我的项目中,我有一个很大的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。我实际上认为 usingByRef会做到这一点。是否可以这样做,我只是有一个错误,或者我必须List(of String)使用函数创建一个新对象并覆盖初始对象。像:

myList = foo(myList)

如果两者都可以,那么什么更有效?因为我必须在只有几十万个元素的 List(of Strings) 上执行此操作。

标签: stringvb.netbyref

解决方案


你必须使用For-loop,你不能用 a 修改字符串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对象,但由于字符串是不可变的,您无法修改它们,但您需要替换它们。您不能替换 a 中的整个对象For Each,因此您需要For.

但请注意,这将删除前两个字符(基于 .NET 的索引为零)并且也不检查字符串长度是否 >= 2。所以这似乎是您需要的:

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

推荐阅读