结构列表中的值不会更改

时间:2013-12-19 09:48:04

标签: vb.net foreach structure

我已经在我的代码中定义了一个结构,并且列出了这个结构“

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

不幸的是,我的列表中的值根本没有变化。我做错了什么?

3 个答案:

答案 0 :(得分:4)

由于ParcelStructure,它会按值传递,因此在迭代集合时,您正在修改结构的副本。

为了更好地理解这种情况,您应该了解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

如果ParcelClass,它将通过引用传递,因此不会创建本地副本,而行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