Возвращаясь различия между двумя enumerables
Я пытаюсь определить различия между двумя коллекциями.
private ObservableCollection<SomeObject> _objectList = null;
private ObservableCollection<SomeObject> _cachedObjectList = null;
SomeObject реализует IEquatable<SomeObject>
Я использую следующее, Чтобы определить, имеют ли мои две коллекции какие-либо различия:
this._objectList.ToList().OrderBy(x => x.Id).SequenceEqual(this._cachedObjectList.ToList().OrderBy(x => x.Id));
- коллекция _cachedObjectList не изменится.
- вы можете добавлять, удалять или изменять объект в коллекции _objectList.
как я могу вернуть новый список, который содержит все вновь добавлен, удален или иным образом изменен объект из двух коллекций.
любая помощь была бы очень признательна!
IEquatable реализация для SomeObject:
public class SomeObject : IEquatable<SomeObject>
{
public int GetHashCode(SomeObject object)
{
return base.GetHashCode();
}
public bool Equals(SomeObject other)
{
bool result = true;
if (Object.ReferenceEquals(other, null))
{
result = false;
}
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(this, other))
{
result = true;
}
else
{
// if the reference isn't the same, we can check the properties for equality
if (!this.Id.Equals(other.Id))
{
result = false;
}
if (!this.OtherList.OrderBy(x => x.Id).ToList().SequenceEqual(other.OtherList.OrderBy(x => x.Id).ToList()))
{
result = false;
}
}
return result;
}
}
}
EDIT: Мне нужны только изменения, если _objectList содержит измененный объект, основанный на IEquatable.Equals() тогда я хотел бы его вернуть. В противном случае верните новые или удаленные объекты в списке.
1 ответов
вы найдете различия с
var newAndChanged = _objectList.Except(_cachedObjectList);
var removedAndChanged = _cachedObjectList.Except(_objectList);
var changed = newAndChanged.Concat(removedAndChanged);