我已经在我的代码中定义了一个结构,并且列出了这个结构“
Structure Parcel
Public name As String
Public type As String
End Structure
Dim ParcelList As New List(Of Parcel)
然后我试图将一些值设置为列表的元素,我知道这个名称
For Each myParcel As Parcel In ParcelList
If (myParcel.name = "Parcel1") Then
myParcel.type="Type1"
End If
Next
不幸的是,我的列表中的值根本没有变化。我做错了什么?
答案 0 :(得分:4)
由于Parcel
是Structure
,它会按值传递,因此在迭代集合时,您正在修改结构的副本。
为了更好地理解这种情况,您应该了解For Each
到底是什么。您的代码可以翻译成:
Dim enumerator As List(Of Parcel).Enumerator = ParcelList.GetEnumerator()
While enumerator.MoveNext()
' Here you have a local copy of your Structure
Dim myParcel As Parcel = enumerator.Current
Dim flag As Boolean = Operators.CompareString(myParcel.name, "Parcel1", False) = 0
If flag Then
' Here you modify your local copy
myParcel.type = "Type1"
End If
End While
如果Parcel
是Class
,它将通过引用传递,因此不会创建本地副本,而行myParcel.type = "Type1"
将更改您的集合中存在的正确对象。
答案 1 :(得分:1)
正如已经陈述的那样,这是因为您正在修改值类型的本地副本。一种方法是按顺序访问列表中的项目,并用新类型替换序数值类型:
For i As Integer = 0 To ParcelList.Count - 1
If ParcelList(i).name = "Parcel1" Then
ParcelList(i) = New Parcel With {.name = ParcelList(i).name, .type = "Type1"}
End If
Next
但实际上你应该将Sturcture改为Class
答案 2 :(得分:-3)
检查字符串时,请使用Equals而不是'='。
If (myParcel.name.equals("Parcel1")) Then
myParcel.type="Type1"
End If
字符串实际上是“对象”。比较字符串(例如StringA = StringB)时,检查内存中字符串的分配而不是字符串的内容。
更好的是:
If (myParcel.name.ToUpper().equals(Cstr("Parcel1").toUpper())) Then
myParcel.type="Type1"
End If
这样你可以忽略任何区别的情况。 例: myParcel.name =“teST”
myParcel.name.equals("test")
is False
myParcel.name.ToUpper().equals(Cstr("test").toUpper())
is true