我只是找不到任何合适的代码来完成我需要的事情。
我在用着Dict.ContainsKey
但由于我总是创建我需要查找的密钥,因此 ContainsKey 总是为 false (因为 hashKey 不同,并且我创建了我想要一直检查的密钥)。
有人可以建议如何覆盖包含密钥或如何在这种情况下处理密钥比较吗?
我的字典看起来像Dictionary<someObj, int>
public class someObj
{
public int someobjParam {get;set;}
public int someobjParamTwo {get;set;}
}
你不需要覆盖ContainsKey
- 你需要either覆盖Equals
and GetHashCode
in someObj
(应该重命名以符合 .NET 命名约定,顺便说一句)or你需要通过IEqualityComparer<someObj> http://msdn.microsoft.com/en-us/library/ms132151%28v=vs.110%29.aspx to the Dictionary<,>构造函数 http://msdn.microsoft.com/en-us/library/ms132072%28v=vs.110%29.aspx。无论哪种方式,该代码都用于比较键(并从中获取哈希码)。
基本上你需要做Equals
确定平等,并使GetHashCode
对于相同的对象返回相同的代码,对于不同的对象最好返回不同的代码 - 请参阅埃里克·利珀特 (Eric Lippert) 的文章GetHashCode http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx更多细节。
另外,你应该考虑使someObj
不可变:可变字典键通常是一个坏主意,就像在将其用作字典中的键后以哈希码敏感的方式修改该键一样,您将无法再次找到它。如果您的自定义类型确实是一个键,那么只需将其设置为不可变即可。
为了简单起见,您还应该考虑制作someObj
实施IEquatable<someObj> http://msdn.microsoft.com/en-us/library/ms131187%28v=vs.110%29.aspx,并考虑使用结构体而不是类是否合适。如果你实施IEquatable<someObj>
你应该also覆盖object.Equals
以一致的方式。通常情况下object.Equals
实现只会调用最强类型的IEquatable<T>.Equals
执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)