2010-01-27 88 views
9

如果我有(参考 - 什么关系呢?)型的MyType不覆盖的Equals方法,将使用什么启发如果ICollection的<的MyType >确定何时包含一个给定的类型实例?ICollection的<T>。载

什么是用我自己的启发式(例如检查的标识属性值的平等)的最好方法?

+0

超载? – 2010-01-27 01:04:27

+0

System.Collections.ObjectModel。集合 Ben 2010-01-27 01:12:37

回答

7

因为您的类型不会覆盖等于,所以会使用等值的默认实现,即引用相等。所以如果集合包含,那么包含将是真实的,例如

要使用自己的比较,请执行IEqualityComparer<T>(例如,比较Ids)并将比较器的实例传递给Contains方法。 (这假设你能够使用LINQ扩展,因为“本地”ICollection<T>.Contains方法没有IEqualityComparer超载。)

+0

出于兴趣是值类型平等对待,为什么不简单地重写equals方法? – Ben 2010-01-27 00:51:33

+0

如果所有字段都相等,则值类型被视为相等。当然,您可以像引用类型一样覆盖值类型上的Equals,并且可以像引用类型一样为值类型编写自定义IEqualityComparer。 – itowlson 2010-01-27 00:56:29

1

它不是由ICollection<T>定义的 - 不同的实现可以使用不同的方法。从MSDN

实现可以在他们 如何确定对象的平等而变化;对于 例如,List<T>使用 Comparer<T>.Default, 而Dictionary<TKey, TValue>允许用户指定 的IComparer<T> 实现用比较 键

在大多数情况下,它只是比较引用,但你应该检查文档您正在使用的具体ICollection<T>

0

据我所知,(在内存地址)的基准进行比较......

如果引用是不够好,对你,那么你可能比较ID,正如你所提到的。

0

根据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(); 
    } 
} 
你用什么具体的集合
相关问题