- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试着关注 Guidelines来自 MSDN,也引用了 This great question但下面的行为似乎并不像预期的那样。
我试图表示类似于 FQN 的结构,其中就好像 P1 在 P2 之前列出一样,P2 只会存在于与 P1 相同的集合。比如作用域是如何工作的。
我有一个类具有这样的属性。
class data{
public readonly string p1, p2;
public data(string p1, string p2) {
this.p1 = p1;
this.p2 = p2;
}
public override int GetHashCode()
{
return this.p1.GetHashCode() ^ this.p2.GetHashCode();
}
/*also show the equal for comparison*/
public override bool Equals(System.Object obj)
{
if (obj == null)
return false;
data d = obj as data;
if ((System.Object)d == null)
return false;
/*I thought this would be smart*/
return d.ToString() == this.ToString();
}
public override string ToString() {
return "[" + p1 +"][" + p2+ "]";
}
}
在 Dictionary
(dict) 中,我使用 data
作为键,所以这会使范围看起来像 d1.p1.p2
(或者更确切地说是 d1 的 p1 的 p2,但是你更愿意想象它)
Dictionary<data,int> dict = new Dictionary<data,int>();
我检查了 d1.p1 和另一个 d2.p1 不同时的行为,操作正确解析。但是,当 d1.p1 和 d2.p1 相同并且 d1 和 d2 的 p2 不同时,我观察到以下行为。
data d1 = new data(){ p1="p1", p2="p2" };
data d2 = new data(){ p1="p1", p2="XX" };
dict.add(d1, 0);
dict.add(d2, 1);
dict[d1] = 4;
结果是两个元素都是4
在监 window 口 (VS2013) 中,我有字典的键列表显示给我,而不是像我通常期望的那样每个索引一个键,我的数据对象的每个属性都是一个索引的键。所以我不确定问题出在哪里,或者我只是误解了 Watch 窗口将对象表示为键。我知道 VS 将如何显示一个对象,但我不确定这就是我希望它在字典中显示一个键的方式。
直接查看每个哈希码后,我注意到它们确实重复。然而字典并不确定索引是否存在。下面是我看到的数据示例。
1132917379 string: [ABC][ABC]
-565659420 string: [ABC][123]
-1936108909 string: [123][123]
//second loop with next set of strings
1132917379 string: [xxx][xxx]
-565659420 string: [xxx][yyy]
//...etc
最佳答案
- Is GetHachCode() overridden correctly?
当然,对于“正确”的某些定义。它可能不会被覆盖很好,但它不是一个不正确的实现(因为被认为相等的类的两个实例将散列为相同的值)。当然,根据该要求,您始终可以从 GetHashCode
返回 0,这将是“正确的”。这肯定不会好。
那是说您的特定实现没有达到应有的水平。例如,在您的类(class)中,字符串的顺序很重要。 IE。 新数据(“A”,“B”)!=新数据(“B”,“A”)
。但是,这些将始终哈希相等,因为您的 GetHashCode
实现是对称的。最好以某种方式打破对称性。例如:
public int GetHashCode()
{
return p1.GetHashCode() ^ ( 13 * p2.GetHashCode() );
}
现在两个不相等的实例发生碰撞的可能性较小。
- Is Equal overridden correctly?
嗯,绝对可以改进。例如,第一个 null 检查是多余的,第二次比较中转换为 object
也是多余的。整件事最好写成:
public bool Equals( object obj )
{
var other = obj as data;
if( other == null ) return false;
return p1 == obj.p1 && p2 == obj.p2;
}
我还删除了对 ToString
的调用,因为它不会显着简化代码或使其更具可读性。这也是执行比较的一种低效方法,因为您必须在比较发生之前构造两个新字符串。直接比较成员可以为您提供更多早出的机会,更重要的是,更容易阅读(实际的相等实现不依赖于字符串表示)。
- If they are both fine how/why does this behavior happen?
我不知道,因为您提供的代码不会执行此操作。它也不会编译。您的 data
类有两个 readonly
字段,您不能使用上一个代码片段中所示的初始化列表来分配它们。
我只能推测您所看到的行为,因为您在此处展示的任何内容都不会导致所描述的行为。
我能给出的最佳建议是确保您的键类不可变。 可变类型不能很好地与 Dictionary
搭配使用。 Dictionary
类不希望对象的哈希码发生变化,因此如果 GetHashCode
依赖于类中任何可变的部分,事情很可能会变得非常搞砸了。
- I thought GetHachCode() was a Dictionary's primary "comparison" operation, is this always correct?
Dictionary
仅使用 GetHashCode
作为“寻址”对象的方式(具体而言,哈希码用于识别应将项目放置在哪个桶中)。它不一定直接将其用作比较。而如果是,它只能用它来判断两个对象不相等,不能用它来判断它们是否相等。
- What's the real "Index" to a Dictionary where the key is an object?
我不完全确定您在这里问什么,但我倾向于说答案是无关紧要。元素去哪里并不重要。如果您关心这类事情,您可能不应该使用 Dictionary
。
关于c# - 了解行为并重写 GetHashCode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25193019/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!