Reputation: 12885
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;
How can I merge both lists into one list where at least one property hasChanged so the User is "dirty"
// According to my logic the users with id 1, 3 and 4 have changed in any of both properties. Note in real life there can and will // be more properties than these 2 properties.
Upvotes: 0
Views: 90
Reputation: 1502036
As Mephy says, implementing IEquatable<User>
would make this simpler - at that point, you could just perform a join:
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));
Then whenever you add a relevant property, you just need to change the Equals
implementation to take account of that.
The result is a sequence of pairs - currently as an anonymous type, but you could use Tuple<,>
if you wanted to return from a method.
Upvotes: 2