需要一个也比较属性的linq连接

时间:2011-07-19 05:36:39

标签: c# linq

我有两个实体列表。想象一下list1是远程的,list2是本地的 - list1是在过去的某个时间创建的,而list2刚刚生成。

我想比较两个列表,通过.id匹配,并比较每个元素的.flag属性。 .flag属性不同的地方,我想选择旧元素,但是使用list2中的.flag属性(新列表)。

下面的示例显示了如何仅选择list1中不同的实体。如何从list1中选择不同的实体,但是使用list2实体中的.flag属性。

注意:我不想select new SomeEntity(){}整个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;

2 个答案:

答案 0 :(得分:0)

  

如何从list1中选择不同的实体,但是使用list2实体中的.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;
}

答案 1 :(得分:0)

您可以在检索items_to_update集合后将其添加到您的代码中:

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