返回两个可枚举之间的差异
Posted
技术标签:
【中文标题】返回两个可枚举之间的差异【英文标题】:Returning the differences between two enumerables 【发布时间】:2011-12-21 14:22:42 【问题描述】:我正在尝试确定两个集合之间的差异。
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 集合中的对象。
如何返回一个新列表,其中包含来自两个集合的任何新添加、删除或以其他方式修改的对象。
任何帮助将不胜感激!
SomeObject 的 IEquatable 实现:
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;
编辑: 我只想要更改,如果 _objectList 包含修改后的对象,基于 IEquatable.Equals() 那么我希望它返回。否则,返回列表中的新对象或删除的对象。
【问题讨论】:
您的收藏是否包含重复元素?如果集合 A 有两个“a”,集合 B 有一个“a”,那么 A - B 的输出将是一个“a”,还是根本没有“a”? @MiguelAngelo,不,没有任何重复的元素。 【参考方案1】:你会发现与
的不同之处var newAndChanged = _objectList.Except(_cachedObjectList);
var removedAndChanged = _cachedObjectList.Except(_objectList);
var changed = newAndChanged.Concat(removedAndChanged);
【讨论】:
答案很好,我唯一要补充的是确保列表包含的对象类型实现IEquatable(Of T)
。这当然是假设它是一个自定义类型。请参阅以下link。
由于某种原因,永远无法达到 IEquatable Equals,有什么想法吗?
@Michael:在实现 IEquatable 时,您可能会做很多错误的事情。
在这种情况下 Concat 比 Union 好,第一个是 O(n) 第二个至少是 O(n log n)。
@MichaelG 忘记 IEquatable 并创建一个实现 IEqualityComparer(Of T)
的单独类,Except
上有一个重载可以使用它。以上是关于返回两个可枚举之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
使用python返回excel中两个不同文件中两列之间的差异