需要一个linq连接来比较属性
本文关键字:连接 linq 比较 属性 一个 | 更新日期: 2023-09-27 18:02:23
我有两个实体列表。假设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;
您可以在检索items_to_update
集合后将其添加到代码中:
foreach (var item in items_to_update)
{
item.flag = list2.Where(c => c.id == item.id).SingleOrDefault().flag;
}
如何从list1中选择不同的实体,但使用来自list2实体的.flag属性。
和
我不想选择new 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;
}