2011-04-21 16 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に追加する必要がありますか?コレクション2にはないがコレクション1にあるアイテムを削除するにはどうすればよいですか?これらは、ソリューションを少し複雑にしますが、それほど難しくありません。 – captncraig

+0

@CMPありがとうございます。はい、最後に私があなたが言及したことすべてをする必要があります。アプローチの本質を理解するために簡単な例を作成したかっただけです。 – rem

答えて

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

2

補完的な答えとして、反射を使用して1つのオブジェクトから別のオブジェクトにN個のフィールドをコピーすることができます。私はすでにこれについてここで話しました:How to refactor this?

あなたは、このコード(両方のオブジェクトが同じクラスです)を実装(工assを)あなたのクラスを持つことができます:あなたのクラスは、新しい性質を持っている場合、あなたは更新を気にする必要はありませんが、そのように

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

をコード、それはすでにそこにある!

異なるクラスのオブジェクトの場合、プロパティ名でリフレクションすることもできますが、いくつかの前提があります(プロパティが存在しない場合、違うタイプのプロパティ、プロパティ値がnullの場合、など)

+0

Ew。反射は高価です。 –

+0

はい、そうです。そして、知恵と一緒に使うべきです。 100万のオブジェクトをコピーしている場合、それは知覚できません(1〜2ミリ秒以上)。 1000の場合、約30〜40ミリ秒以上かかる。 10.000、300〜350ミリ秒ほど、眉毛が上がります。それは100,000を超える臭いが始まります。したがって、慎重に使用してください。 Obs .:ベンチマークアプリからのデータ。 –