返回两个可枚举之间的差异

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&lt;SomeObject&gt;

我正在使用以下内容来确定我的两个集合是否有任何差异:

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 上有一个重载可以使用它。

以上是关于返回两个可枚举之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何返回两个列表之间的差异?

Mysql 只返回两个表之间存在差异的记录

返回两个数组之间的差异

使用python返回excel中两个不同文件中两列之间的差异

RXJS可观察的方法.pipe()和.subscribe()之间的差异

获得两个字符串之间的共同点## [关闭]