用户定义的集合 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);
这是我的模型:
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);