C# i收集<;T>;。包含在自定义类型上
如果我有一个不覆盖Equals方法的(reference-这有关系吗?)类型MyType,那么在确定ICollection是否包含该类型的给定实例时,将使用什么启发式方法C# i收集<;T>;。包含在自定义类型上,c#,.net,collections,contains,C#,.net,Collections,Contains,如果我有一个不覆盖Equals方法的(reference-这有关系吗?)类型MyType,那么在确定ICollection是否包含该类型的给定实例时,将使用什么启发式方法 使用我自己的启发法(例如,检查Id属性值是否相等)的最佳方法是什么?由于您的类型不重写Equals,因此将使用Equals的默认实现,即引用equality。因此,如果集合包含该实例,则Contains将为真 要使用自己的比较,请实现IEqualityComparer(例如,比较ID),并将比较器的实例传递到Contains方
使用我自己的启发法(例如,检查Id属性值是否相等)的最佳方法是什么?由于您的类型不重写Equals,因此将使用Equals的默认实现,即引用equality。因此,如果集合包含该实例,则Contains将为真
要使用自己的比较,请实现
IEqualityComparer
(例如,比较ID),并将比较器的实例传递到Contains方法中。(这假设您能够使用LINQ扩展,因为“本机”ICollection.Contains
方法没有IEqualityComparer重载。)它不是由ICollection
定义的-不同的实现可以使用不同的方法。发件人:
实现方式可能有所不同
确定对象的平等性;对于
例如,List
使用
比较器。默认值
,
而字典
允许用户指定
i比较程序
用于比较的实现
钥匙
在大多数情况下,它只会比较引用,但是您应该检查文档中您正在使用的特定的i集合。AFAIK,将比较引用(内存中的地址)
如果引用对您来说不够好,那么您可以比较ID,正如您所提到的。根据MSDN:
实现方式可能有所不同
确定对象的平等性;对于
示例(列表)使用
比较器):。默认值,
而字典)允许用户指定
(国际比较公司)
用于比较的实现
钥匙
自行完成此操作的最佳方法是使用重载,该重载需要一个IEqualityComparer
公共类MyComparer:IEqualityComparer
{
公共布尔等于(MyType x,MyType y)
{
返回x.Id==y.Id;
}
public int GetHashCode(MyType obj)
{
返回obj.Id.GetHashCode();
}
}
出于兴趣,值类型被同等对待,为什么不简单地重写equals方法呢?如果值类型的所有字段都相等,则认为它们是相等的。当然,您可以像重写引用类型一样重写值类型上的等于,也可以像重写引用类型一样为值类型编写自定义IEqualityComparer。您使用的是什么特定集合?System.Collections.ObjectModel.collection
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();
}
}