C# 具有用户定义类的集合-查找差异

C# 具有用户定义类的集合-查找差异,c#,observablecollection,iequalitycomparer,icomparable,C#,Observablecollection,Iequalitycomparer,Icomparable,这是我的模型: public class EventModel { public DateTime? EVENT_DATE { get; set; } public decimal? EVENT_TYPE { get; set; } public string EVENT_DESCRIPTION { get; set; } } 我将这个类填入ObservableCollection。当我这样做时,我也会深度复制同一个收藏。然后我想在以后的使用中比较这两个集合 我很乐意使

这是我的模型:

public class EventModel
{
    public DateTime? EVENT_DATE { get; set; }
    public decimal? EVENT_TYPE { get; set; }
    public string EVENT_DESCRIPTION { get; set; }
}
我将这个类填入
ObservableCollection
。当我这样做时,我也会深度复制同一个收藏。然后我想在以后的使用中比较这两个集合

我很乐意使用LINQ来实现这一点,比如

bool are_same = collection1.OrderBy(i => i).SequenceEqual(
                 collection2.OrderBy(i => i));
这意味着需要对两个集合进行排序,然后相互比较,以便在
所有属性中找到差异

有很多实现
IComparable&IEqualityComparer
的例子,但我不清楚我需要什么以及如何实现


如果有人能告诉我如何在C#中实现这一点,我将不胜感激。

如果您只是想检查这两个集合是否相等,您需要定义什么是相等,例如通过实现
IEqualityComparer
。这也可以通过实现
IEquatable
或重写
Equals(object)
GetHasCode
来实现。这可以通过一些重构工具自动完成:

public sealed class EventModelEqualityComparer : IEqualityComparer<EventModel>
    {
        public bool Equals(EventModel x, EventModel y)
        {
            if (ReferenceEquals(x, y)) return true;
            if (ReferenceEquals(x, null)) return false;
            if (ReferenceEquals(y, null)) return false;
            if (x.GetType() != y.GetType()) return false;
            return Nullable.Equals(x.EVENT_DATE, y.EVENT_DATE) &&
                   x.EVENT_TYPE == y.EVENT_TYPE &&
                   x.EVENT_DESCRIPTION == y.EVENT_DESCRIPTION;
        }

        public int GetHashCode(EventModel obj)
        {
            unchecked
            {
                var hashCode = obj.EVENT_DATE.GetHashCode();
                hashCode = (hashCode * 397) ^ obj.EVENT_TYPE.GetHashCode();
                hashCode = (hashCode * 397) ^ (obj.EVENT_DESCRIPTION != null ? obj.EVENT_DESCRIPTION.GetHashCode() : 0);
                return hashCode;
            }
        }
    }

到底是什么?找出差异?如何实现IComparable/iQualityComparer?比较集合时顺序重要吗?输出应该是什么?你能举一个输入/预期输出的例子吗?这里的最终目标是什么?@JonasH,
collection1
是绑定到UI的集合
collection2
用于启用按钮以保存对数据库的更改。所以输出应该是一个
布尔值
,指示集合中的任何属性是否已更改。项目总是处于相同的位置(我想),我从数据库中获取数据后立即深度复制
collection1
。如果我理解正确,这个类是完全独立的。我不应该直接在EventModel中实现IEqualityCompared?接下来,您提到的重构工具是如何自动完成的?最后,如果进行了更改,
IEqualityComparer
的实现是一个独立的类,但如果需要,可以作为嵌套类实现。您可以让
EventModel
实现
IEquatable
,这更易于使用,因为您不需要定义equalityComparer,但由于您只能有一个IEquatable实现,因此灵活性较低<如果集合包含相同的项,则code>SetEquals将返回true,否则返回false。@应该为所有
IEnumerable
(包括ObservableCollection)定义lucy82,检查您是否导入了正确的名称空间,并且正在使用.Net 4.8或更高版本。不知道你说的不是所有情况下都工作是什么意思。上面的比较代码应该考虑两个对象是否相等(如果只有),所有的属性都是相等的。@ LUYY85只在对象改变顺序时,比如移除一个对象并添加另一个对象。即使用集合符号
collection1⊆ collection2
collection1=collection2
。注意,您可以简单地添加一个扩展方法:
ToHashSet(这个IEnumerable e)=>newhashset(e)
myCollection.ToHashSet(new EventModelEqualityComparer()).SetEquals(myOtherCollection);