将 2 个列表与至少一个属性已更改的 linq 合并

本文关键字:属性 合并 linq 一个 列表 | 更新日期: 2023-09-27 18:19:37

var usersOld = new List<User>();
var userOld1 = new User { IsDisabled = true, IsLicenced = false, Id = 1 };
var userOld2 = new User { IsDisabled = true, IsLicenced = false, Id = 2 };
var userOld3 = new User { IsDisabled = true, IsLicenced = false, Id = 3 };
var userOld4 = new User { IsDisabled = true, IsLicenced = false, Id = 4 };
usersOld.Add(userOld1);
usersOld.Add(userOld2);
usersOld.Add(userOld3);
usersOld.Add(userOld4);
var usersToday = new List<User>();
var userNew1 = new User { IsDisabled = true, IsLicenced = true, Id = 1 };
var userNew2 = new User { IsDisabled = true, IsLicenced = false, Id = 2 };
var userNew3 = new User { IsDisabled = false, IsLicenced = false, Id = 3 };
var userNew4 = new User { IsDisabled = true, IsLicenced = true, Id = 4 };
usersToday.Add(userNew1);
usersToday.Add(userNew2);
usersToday.Add(userNew3);
usersToday.Add(userNew4);
var query = null; 

如何将两个列表合并为一个列表,其中至少有一个属性已更改,因此用户"脏">

根据我的逻辑,ID 为 1、3 和 4 的用户在这两个属性中的任何一个中都发生了变化。注意在现实生活中可以而且会 是比这 2 个属性更多的属性。

将 2 个列表与至少一个属性已更改的 linq 合并

正如 Mephy 所说,实现IEquatable<User>会让事情变得更简单 - 在这一点上,你可以执行一个连接:

var changes = usersOld.Join(usersNew, o => o.Id, n => n.Id,
                            (o, n) => new { Old = o, New = n })
                      .Where(pair => !pair.Old.Equals(pair.New));

然后,每当您添加相关属性时,您只需要更改Equals实现即可考虑到这一点。

结果是一个对序列 - 当前为匿名类型,但如果要从方法返回,可以使用Tuple<,>