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);