我有两个实体列表。想象一下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;
答案 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;
}