由于LINQ查询而修改了默认对象

时间:2010-05-06 18:48:21

标签: .net vb.net linq

我正在执行以下代码来过滤对象列表,然后才能将其打印出来。

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查询的方式有关。有没有人之前有类似的问题和\或我该怎么做才能防止我的初始列表被截断。

3 个答案:

答案 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))