C#覆盖字典ContainsKey

C#覆盖字典ContainsKey,c#,dictionary,overriding,C#,Dictionary,Overriding,我就是找不到任何合适的代码来做我需要的事情 我使用的是Dict.ContainsKey,但由于我总是创建我需要查找的密钥,所以ContainsKey的值总是为false(因为hashKey是不同的,我创建的密钥我想一直检查) 在这种情况下,是否有人可以建议如何覆盖包含密钥或如何处理密钥? 我的字典看起来像 字典 您不需要覆盖ContainsKey——您需要覆盖someObj中的Equals和GetHashCode(应重命名以符合.NET命名约定,顺便说一句),或者需要将。无论哪种方式,该代码都用

我就是找不到任何合适的代码来做我需要的事情

我使用的是Dict.ContainsKey,但由于我总是创建我需要查找的密钥,所以ContainsKey的值总是为false(因为hashKey是不同的,我创建的密钥我想一直检查)

在这种情况下,是否有人可以建议如何覆盖包含密钥或如何处理密钥? 我的字典看起来像
字典


您不需要覆盖
ContainsKey
——您需要覆盖
someObj
中的
Equals
GetHashCode
(应重命名以符合.NET命名约定,顺便说一句),或者需要将。无论哪种方式,该代码都用于比较键(并从键中获取哈希代码)

基本上,您需要使
等于
确定相等,并使
GetHashCode
为相等的对象返回相同的代码,理想情况下为不同的对象返回不同的代码-有关更多详细信息,请参阅

同样,你应该考虑使<代码>某个Obji>代码不可变:一般来说,可变字典键是一个坏主意,就像在使用字典中的一个键之后,以一个哈希代码敏感的方式修改密钥,你将无法再找到它。如果自定义类型的目的真的是要成为键,那么就让它不可变


为简单起见,您还应该考虑使用<代码>某个Obji实现,并考虑是否应该是一个结构而不是一个类。如果您实现了

IEquatable
,您还应该以一致的方式重写
object.Equals
。通常,<>代码>对象。等同于实现将只调用最强类型的<代码> IEQualTea.等于实现。

< p>不需要重写<代码>包容键< /C> >,而当它认为两个键相等时,请指导字典。

实现这一点的一种方法是在关键类中实现。如果平等的概念在您的应用程序中是全球性的,请执行此操作:

public class someObj : IEquatable<someObj>
{
    public int someobjParam {get;set;}
    public int someobjParamTwo {get;set;}

    // override GetHashCode() and Equals(); for an example
    // see http://msdn.microsoft.com/en-us/library/ms131190%28v=vs.110%29.aspx
}
公共类someObj:IEquatable
{
公共int someobjParam{get;set;}
公共int someobjParamTwo{get;set;}
//覆盖GetHashCode()和Equals();例如
//看http://msdn.microsoft.com/en-us/library/ms131190%28v=vs.110%29.aspx
}

另一种方法是实现一个
IEqualityComparer
并将其传递给字典的构造函数。

您能给我一个代码示例吗?我知道这就是我在问题中提到的问题。@OriRefael:我的回答中哪一点会难倒你?您是否尝试过在
someObj
中适当地重写
Equals
GetHashCode
?最好是自己尝试,而不是让别人为你编写代码。另外,你的问题真的不清楚(在我看来),这对我们没有帮助…如果我现在没有压力,需要快速解决问题,你是对的。如果你只想帮忙就好了,就是这样。谢谢你的解释。@OriRefael:我想帮助你——我想帮助你成为一名更好的开发人员,通过学习把建议付诸实践,并就其他需要考虑的事情(不变性等)给你建议。让别人写代码不是很容易扩展的。另一种懒惰的方法(三大优点之一)是使用VisualStudio扩展自动生成此代码。例如,R#有一个函数“Generate->Equality Members”来自动完成这项工作。@Sameer:虽然我正在做,但其实没什么不同。乔恩只是先按回车键,其实不一样。这个答案与C#混合使用了相同的java语法,但它也以不同的方式解决了相同的问题(通过实现ContainsKey方法使用的接口)。编辑:现在Jon Skeet的答案也有一个合理的建议well@Jon:您使用了“implements”而不是“:”@JonSkeet:Duh。谢谢
public class someObj : IEquatable<someObj>
{
    public int someobjParam {get;set;}
    public int someobjParamTwo {get;set;}

    // override GetHashCode() and Equals(); for an example
    // see http://msdn.microsoft.com/en-us/library/ms131190%28v=vs.110%29.aspx
}