C#覆盖Dictionary ContainsKey

Ori*_*ael 0 c# dictionary overriding

我找不到任何适当的代码来做我需要的东西.

我正在使用,Dict.ContainsKey但由于我总是创建我需要寻找的密钥的事实,我总是得到ContainsKey假(因为hashKey是不同的,我创建我想要一直检查的密钥).

在这种情况下,有人可以建议如何覆盖包含键或如何处理键比较?我的字典看起来像 Dictionary<someObj, int>

public class someObj
{
    public int someobjParam {get;set;}
    public int someobjParamTwo {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

你并不需要重写ContainsKey-你需要要么覆盖EqualsGetHashCodesomeObj(应改名以符合.NET命名约定,顺便说一句),或者你需要一个传递IEqualityComparer<someObj>Dictionary<,>构造函数.无论哪种方式,该代码用于比较密钥(并从中获取哈希码).

基本上你需要Equals确定相等,并GetHashCode为相同的对象返回相同的代码,并为不同的对象返回理想的不同代码 - 有关GetHashCode详细信息,请参阅Eric Lippert的文章.

此外,您应该考虑使用someObj不可变:可变字典键通常是一个坏主意,就像您在将字符串作为字典中的键使用后以哈希码敏感方式修改键时,您将无法再次找到它.如果您的自定义类型的点确实是一个键,那么只需使其不可变.

为简单起见,您还应该考虑制作someObj工具IEquatable<someObj>,并考虑是否适合成为结构而不是类.如果实现了IEquatable<someObj>,你应该覆盖object.Equals以一致的方式.通常,object.Equals实现只会调用最强类型的IEquatable<T>.Equals实现.


Jon*_*Jon 5

您不需要覆盖ContainsKey,而是在应该考虑两个键相等时指示字典.

一种方法是IEquatable<someObj>在您的密钥类中实现.如果您的应用程序中的平等概念是全局的,请执行此操作:

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
}
Run Code Online (Sandbox Code Playgroud)

另一个是通过实现IEqualityComparer<someObj>并将其传递给字典的构造函数.