需要一个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;

需要一个linq连接来比较属性

您可以在检索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;
}