2011-04-21 141 views
1

以下方法是從另一個集合(基於同一個類)更新ObservableCollection或者更好地以另一種方式完成(或者只是爲了改進)?從另一個集合更新集合的有效方法

foreach (MyEntity c in collection2) 
    { 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().Field1 = c.Field1; 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().Field2 = c.Field2; 
     ... 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().FieldN = c.FieldN;   
    } 

EntID是主鍵。
(足夠好,我的意思是快速和高效)。

+0

您是否需要將collection2中新增的項目添加到collection1?除去不在collection 2中但在collection1中的項目呢?這些解決方案有點複雜,但並不困難。 – captncraig 2011-04-21 16:44:18

+0

@CMP謝謝。是的,最後我需要完成你所提到的一切。只是想讓示例更簡單,以獲得方法的本質。 – rem 2011-04-21 16:52:18

回答

3
var myItem = collection1.Where(p => p.EntID == c.EntID).FirstOrDefault(); 
    if (myItem == null) 
     continue; 
    myItem.Field1 = c.Field1; 
    myItem.Field2 = c.Field2; 
    ... 
    myItem.FieldN = c.FieldN; 

如果myItemc是不同的類型,看看AutoMapper。

+0

看起來更好,並且通過不爲每個物業查找物品而節約了很多。空檢查也避免了潛在的崩潰錯誤。 – captncraig 2011-04-21 16:42:31

2

作爲補充答案,您可以使用反射將N個字段從一個對象複製到另一個對象。我已經在這裏討論過這個問題:How to refactor this?

你可以有你的類(SomeClass的)實現該代碼(這兩個對象是同一類):

public void CopyPropertiesFrom(SomeClass SourceInstance) 
{ 
    foreach (PropertyInfo prop in typeof(SomeClass).GetProperties()) 
     prop.SetValue(this, prop.GetValue(SourceInstance, null), null); 
} 

這樣一來,如果你的類有新的屬性,你不必費心更新代碼,它已經在那裏了!

對於不同類的對象,這也可以通過屬性名反射來實現,但是有一些假設你必須做出(如果屬性不存在,什麼屬性是不同類型,什麼是屬性值爲null,等等)

+0

Ew。反思代價高昂。 – 2011-04-21 17:38:02

+0

是的。並應該用智慧。如果他正在複製100個物體,那麼它是不可察覺的(1-2毫秒多)。對於1000,大約需要30-40毫秒。對於10.000,300-350毫秒更多,眉毛提高。它只在100000以上開始發臭。所以,謹慎使用。 Obs .:來自基準應用程序的數據。 – 2011-04-21 20:39:46

相關問題