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

问题描述

这是我的模型:

public class EventModel
{
    public DateTime? EVENT_DATE { get; set; }
    public decimal? EVENT_TYPE { get; set; }
    public string EVENT_DESCRIPTION { get; set; }
}

我将这个类填入 ObservableCollection<EventModel>。当我这样做时,我也会深度复制相同的集合。然后我想在以后的使用中比较这两个集合。

我最好使用 LINQ 来做到这一点,比如

bool are_same = collection1.OrderBy(i => i).SequenceEqual(
                 collection2.OrderBy(i => i));

这意味着需要对两个集合进行排序,然后相互比较以查找 ALL PROPERTIES 中的差异。

有很多实现 IComparable & IEqualityComparer 的示例,但我对我需要什么以及如何实现感到困惑。

如果有人向我展示如何在 C# 中完成此操作,我将不胜感激。

解决方法

如果您只是想检查两个集合是否相等,则需要定义相等性,例如通过实现 IEqualityComparer<T>。这也可以通过实现 IEquatable<T> 或通过覆盖 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;
            }
        }
    }

要比较两个集合以查看它们是否包含相同的项目,但位于任意位置,您可以使用 HashSet.SetEquals

myCollection.ToHashSet(new EventModelEqualityComparer()).SetEquals(myOtherCollection);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...