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

时间:2018-12-13 11:15:23

标签: string vb.net byref

以下示例已简化。在我的项目中,我有一个很大的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 :(得分:2)

您必须使用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)

答案 1 :(得分:2)

在此代码中:

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