ICollection 。包含自定义类型
如果我有一个(引用 – 它有关系吗?)类型MyType ,它不会覆盖Equals方法,在确定ICollection 是否包含给定的类型实例时将使用什么启发式?
使用我自己的启发式方法的最佳方法是什么(例如,检查Id属性值是否相等)?
因为您的类型不会覆盖Equals,所以将使用Equals的默认实现,即引用相等。 因此,如果集合包含该实例,则Contains将为true。
要使用您自己的比较,请实现IEqualityComparer
(例如,比较ID)并将比较器的实例传递给Contains方法。 (这假设您可以使用LINQ扩展,因为“本机” ICollection
方法没有IEqualityComparer重载。)
它不是由ICollection
定义的 – 不同的实现可以使用不同的方法。 来自MSDN :
实现可以在决定对象相等性方面有所不同; 例如,
List
使用Comparer
,而.Default Dictionary
允许用户指定用于比较键的IComparer
实现
在大多数情况下,它只会比较引用,但您应该查看您正在使用的特定ICollection
的文档。
AFAIK,参考(内存中的地址)将被比较……
如果参考对您不够好,那么您可以比较ID,如您所述。
根据MSDN:
实现可以在决定对象相等性方面有所不同; 例如,List <(Of <(T>)>)使用Comparer <(Of <(T>)>).. ::。Default,而Dictionary <(Of <(TKey,TValue>)>)允许用户指定用于比较键的IComparer <(Of <(T>)>)实现。
自己做的最好方法是使用带有IEqualityComparer
的重载
public class MyComparer : IEqualityComparer { public bool Equals(MyType x, MyType y) { return x.Id == y.Id; } public int GetHashCode(MyType obj) { return obj.Id.GetHashCode(); } }