2011-07-19 4 views
2

私はエンティティの2つのリストを持っています。リスト1は遠隔地であり、リスト2はローカルであるとしましょう - 過去にlist1が作成され、list2が生成されました。プロパティを比較するlinq結合が必要です

両方のリストを比較し、.idで照合し、各要素の.flagプロパティのみを比較したいとします。 .flagプロパティが異なる場合は、古い要素を選択したいが、list2(新しいリスト)の.flagプロパティを使用する。

以下の例では、list1内の異なるエンティティだけを選択する方法を示しています。リスト1のエンティティを選択するにはどうすればよいですか。ただし、list2エンティティの.flagプロパティを使用します。

注:実際の問題のようにSomeEntityクラス全体をselect new SomeEntity(){}にしたくない場合、私が扱っているクラスには多くのプロパティがあります。

class SomeEntity 
{ 
    public int id; 
    public bool flag; 
    public int some_value = -1; 
} 

// Setup the test 
List<SomeEntity> list1 = new List<SomeEntity>(); 
List<SomeEntity> list2 = new List<SomeEntity>(); 
for (int i = 0; i < 10; i++) 
{ 
    list1.Add(new SomeEntity() { id = i, flag = true, some_value = i * 100 }); 
    list2.Add(new SomeEntity() { id = i, flag = true, }); 
} 
// Toggle some flags 
list1[3].flag = false; 
list2[7].flag = false; 

// Now find the entities that have changed and need updating 
var items_to_update = from x in list1 
         join y in list2 on x.id equals y.id 
         where x.flag != y.flag 
         select x; 

答えて

0

あなたはitems_to_updateコレクションを取得した後、あなたのコードにこれを追加することができます。

foreach (var item in items_to_update) 
{ 
    item.flag = list2.Where(c => c.id == item.id).SingleOrDefault().flag; 
} 
+1

これは私がやることです - 多くのありがとう。私はZiavが言ったことにすべてが従っていると思う、linqはエンティティを変更するためのツールではない。それを細くして 'item.flag = list2.Single(c => c.id == item.id).flag;' – nandor

+0

はい、それはいいようです。 –

0

どのように私は異なっているLIST1からエンティティを選択しますが、リスト2のエンティティから.flagプロパティを使用することができます。

私は新しいSomeEntityを選択したくない(){}

あなたが復帰する前にLIST1内のエンティティを変更することを意味します。 Linqはそのための明確なツールではありません。

foreach (var item in from x in list1 
         join y in list2 on x.id equals y.id 
         where x.flag != y.flag 
         select new {x, y}) 
{ 
    item.x.flag = item.y.flag 
    yield return item.x; 
} 
+0

おかげZiavを - あなたは、LINQは、値を変更するための間違ったツールであると言うとき、あなたは絶対に正しいです。 – nandor

関連する問題