以下示例已简化。在我的项目中,我有一个很大的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)
如果两种方法都能奏效,哪个更有效?由于我必须在只有几千个元素的字符串列表中执行此操作。
答案 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