下面的例子被简化了。在我的项目中,我有一个大的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对象中。实际上,我认为使用ByRef
可以做到这一点。这样做可能吗?我只是犯了一个错误,还是必须使用函数创建一个新的List(of String)
并覆盖inital对象。类似:
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