我正在执行以下代码来过滤对象列表,然后才能将其打印出来。
Dim printList As New List(Of dispillPatient)
For Each pat As dispillPatient In patList
If (From meds In pat.Medication Select meds Where meds.Print = True).Count > 0 Then
Dim patAdd As New dispillPatient
patAdd = pat
patAdd.Medication = DirectCast((From meds In pat.Medication Select meds Where meds.Print = True).ToList, List(Of dispillMedication))
printList.Add(patAdd)
End If
Next
正在发生的是patList
,这是我的初始列表,对于其内部的每个dispillPatient
,特定患者的药物对象(这是另一个列表)正缩短到列表中。返回patAdd
对象。
我认为这与我在执行pat
时使用patAdd = pat
对象的副本以及我正在使用的LINQ查询的方式有关。有没有人之前有类似的问题和\或我该怎么做才能防止我的初始列表被截断。
答案 0 :(得分:2)
假设pat
表示的对象是Class
,则在将对象分配给patAdd
时不会复制该对象,只会复制对象的引用,因此您现在有两个对同一对象的引用。
如果要创建对象的副本,则需要编写自己的Copy
方法,手动执行此操作,然后编写类似patAdd = pat.Copy()
的内容。
答案 1 :(得分:2)
patAdd = pat
这是你的问题。这不创建pat
实例的副本,这只会使您的patAdd
变量指向与pat
变量相同的实例。
为了做到这一点,您必须根据dispillPatient
创建一个新的pat
对象,并将实例存储在patAdd
中。
虽然没有为此做出特定的习惯用法,但一些常见的方法是复制构造函数:
Public Sub New(source as dispillPatient)
' copy whatever is necessary from source, realizing that any
' other reference types -- like lists -- also need to be duplicated
' in similar fashion
End Sub
或复制/克隆功能
Public Function Clone() As dispillPatient
Dim output as new dispillPatient
' copy whatever is necessary to output, realizing that any
' other reference types -- like lists -- also need to be duplicated
' in similar fashion
return output
End Function
答案 2 :(得分:0)
这是一个参考作业 - 没有复制!
patAdd = pat
这意味着patAdd和pat是同一个东西!
这会修改patAdd(因为pat是相同的,它也被修改)
patAdd.Medication = DirectCast((From meds In pat.Medication Select meds Where meds.Print = True).ToList, List(Of dispillMedication))