2010-05-06 28 views
0

我正在執行以下代碼以在對象列表被髮送出去之前進行過濾以進行打印。由於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名單目的。

我認爲這與.NET使我的pat對象的副本在做patAdd = pat和我正在使用的LINQ查詢時的方式有關。有沒有人有過類似的問題之前和\或我能做些什麼來保持我的初始名單被截斷。

回答

2

假設由pat表示的對象是Class,那麼當你把它分配給patAdd對象不被複制,唯一的參考對象被複制,所以你現在有兩個引用同一個對象。

如果你想創建一個對象的副本,你需要編寫你自己的Copy方法,它可以手動完成,然後寫下類似patAdd = pat.Copy()的東西。

2
patAdd = pat 

這是你的問題。這樣做不是創建您的pat實例的副本,這隻會使您的patAdd變量指向與變量pat相同的實例。

爲了做到這一點,你必須創建基於patdispillPatient對象和存儲比如在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 
0

這是一個參考的任務 - 沒有副本製作!

patAdd = pat 

這意味着patAdd和pat是同一件事!

這會修改patAdd(既然拍的是同一件事,它也被修改)

patAdd.Medication = DirectCast((From meds In pat.Medication Select meds Where meds.Print = True).ToList, List(Of dispillMedication))