如果我有(参考 - 什么关系呢?)型的MyType不覆盖的Equals方法,将使用什么启发如果ICollection的<的MyType >确定何时包含一个给定的类型实例?ICollection的<T>。载
什么是用我自己的启发式(例如检查的标识属性值的平等)的最好方法?
如果我有(参考 - 什么关系呢?)型的MyType不覆盖的Equals方法,将使用什么启发如果ICollection的<的MyType >确定何时包含一个给定的类型实例?ICollection的<T>。载
什么是用我自己的启发式(例如检查的标识属性值的平等)的最好方法?
因为您的类型不会覆盖等于,所以会使用等值的默认实现,即引用相等。所以如果集合包含,那么包含将是真实的,例如。
要使用自己的比较,请执行IEqualityComparer<T>
(例如,比较Ids)并将比较器的实例传递给Contains方法。 (这假设你能够使用LINQ扩展,因为“本地”ICollection<T>.Contains
方法没有IEqualityComparer超载。)
它不是由ICollection<T>
定义的 - 不同的实现可以使用不同的方法。从MSDN:
实现可以在他们 如何确定对象的平等而变化;对于 例如,
List<T>
使用Comparer<T>.Default
, 而Dictionary<TKey, TValue>
允许用户指定 的IComparer<T>
实现用比较 键
在大多数情况下,它只是比较引用,但你应该检查文档您正在使用的具体ICollection<T>
。
据我所知,(在内存地址)的基准进行比较......
如果引用是不够好,对你,那么你可能比较ID,正如你所提到的。
根据MSDN:
实现可以在它们 如何确定对象的平等而变化;为 例如,列表<(OF <(T>)>)使用 的Comparer <(中<(T>)>).. ::。默认, 而字典<(中<(TKEY的, TValue>中)> )允许用户指定用于比较 密钥的IComparer <(的<(T>)>) 实现。
做你自己的最佳方式是使用需要一个IEqualityComparer<T>
public class MyComparer : IEqualityComparer<MyType>
{
public bool Equals(MyType x, MyType y)
{
return x.Id == y.Id;
}
public int GetHashCode(MyType obj)
{
return obj.Id.GetHashCode();
}
}
你用什么具体的集合
超载? – 2010-01-27 01:04:27
System.Collections.ObjectModel。集合 –
Ben
2010-01-27 01:12:37