用户定义的集合 class - 找出差异

Collections with user defined class - find differences

这是我的模型:

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

我把这个class填成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);