- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C# 新手。也许我没有正确地实现 IEquatable
,因为我的类型的对象应该被认为是相同的,但不是。
类(class):
class CompPoint : IComparable {
public int X;
public int Y;
public CompPoint(int X, int Y) {
this.X = X;
this.Y = Y;
}
public override bool Equals(Object o) {
if (!(o is CompPoint)) {
throw new ArgumentException(String.Format("argument is not a CompPoint (%s given)", o));
}
CompPoint cp = (CompPoint)o;
return this.X == cp.X && this.Y == cp.Y;
}
public override int GetHashCode() {
int hash = base.GetHashCode(); // this is a problem. replace with a constant?
hash = (hash * 73) + this.X.GetHashCode();
hash = (hash * 73) + this.Y.GetHashCode();
return hash;
}
}
(CompPoint
不仅如此,还证明它是一个类。)
然后,这个测试失败了:
[TestMethod()]
public void compPointTest() {
Assert.AreEqual(new CompPoint(0, 0), new CompPoint(0, 0));
}
我误会了什么? Assert.AreEqual()
使用引用相等吗?我在 CompPoint
中的 Equals()
函数搞砸了吗?
这个函数也失败了:
public void EqualsTest() {
Assert.IsTrue(new CompPoint(1, 1).Equals(new CompPoint(1, 1)));
}
这是因为我正在使用 Dictionary
,但它并没有像我希望的那样工作:
[TestMethod()]
public void dictCompPointTest() {
IDictionary<CompPoint, int> dict = new Dictionary<CompPoint, int>();
dict[new CompPoint(0, 0)] = 4;
dict[new CompPoint(0, 0)] = 24;
dict[new CompPoint(0, 0)] = 31;
Assert.AreEqual(31, dict[new CompPoint(0, 0)]);
Assert.AreEqual(1, dict.Count);
}
测试失败并显示此消息:
Test method ShipAILabTest.BoardUtilsTest.dictCompPointTest threw exception: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
这个测试概括了我的期望。我希望由于 key 每次都相同,因此值将被覆盖。 Dictionary
用来测试相等性的是什么?
更新:我按照 Thomas 的建议添加了一个相等函数,现在 CompPoint
比较测试有效,dictCompPointTest
有效。
public override bool Equals(Object o) {
if (!(o is CompPoint)) {
throw new ArgumentException(String.Format("argument is not a CompPoint (%s given)", o));
}
CompPoint cp = (CompPoint)o;
return this.X == cp.X && this.Y == cp.Y;
}
奇怪的是,这个测试仍然失败了:
[TestMethod()]
public void dictCPTest2() {
IDictionary<CompPoint, int> dict = new Dictionary<CompPoint, int>();
dict[new CompPoint(2, 2)] = 2;
dict[new CompPoint(2, 2)] = 2;
Assert.AreEqual(1, dict.Count);
}
当键为 new CompPoint(4, 1)
时测试也会失败,但当键为 new CompPoint(0, 1)
时则不会。为什么这适用于某些值(value)观而不适用于其他值(value)观?
更神秘的是:散列码函数似乎工作得相当糟糕。此测试失败:
[TestMethod()]
public void hashCodeTest() {
int x = 0;
int y = 0;
Assert.AreEqual(new CompPoint(x, y).GetHashCode(), new CompPoint(x, y).GetHashCode());
}
哈希码函数如上所列。这里有什么问题?这两个 CompPoint
对象不应该有相同的哈希码吗?也许我对 base.getHashCode()
的调用有问题?
最佳答案
我认为Assert.AreEqual
只使用 Object.Equals
, 不是 IEquatable<T>.Equals
.所以你需要覆盖 Equals
反射(reflect)IEquatable<T>.Equals
的逻辑.
或者您也可以使用 Assert.IsTrue
:
IEquatable<CompPoint> p1 = new CompPoint(0, 0);
IEquatable<CompPoint> p2 = new CompPoint(0, 0);
Assert.IsTrue(p1.Equals(p2));
请注意,我将 p1 和 p2 声明为 IEquatable<CompPoint>
: 这是为了确保 IEquatable<CompPoint>.Equals
被称为而不是 Object.Equals
, 因为接口(interface)是显式实现的
编辑:顺便说一下,您可能想要声明 CompPoint
作为结构而不是类。这样,您甚至不必执行任何操作,因为值类型是根据它们的字段值进行比较的
关于C# XNA : Trouble with Dictionaries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218816/
假设我有一个论坛,其中包含用户/管理员可以访问/管理的主题。 当用户访问它时,我首先会检查主题是否存在;在我设置一个标志后,告诉系统用户是否已访问过该主题。 这将是基本代码: 1 if(
我有一个基类 MessageHandler 和 2 个派生类,MessageHandler_CB 和 MessageHandler_DQ。 派生类重新定义了 handleMessage(...) 方法
我已经在我的 NOOBS 操作系统上安装了 v4l2loopback,但它不起作用。 我已经检查过是否安装了 v4l2loopback,它是。但是当我输入 sudo modprobe v4l2loop
我们正处于项目的最后一步,我们无法摆脱这个问题。 基本上,我们正在开发的页面是在视频中创建章节的表单。对于创建的每个章节,验证后都会创建一张小“卡片”。我们希望用户能够通过单击每个章节卡中显示的 X
我是 C# 新手。也许我没有正确地实现 IEquatable,因为我的类型的对象应该被认为是相同的,但不是。 类(class): class CompPoint : IComparable {
在我的代码顶部,我需要询问用户是否想玩游戏。使用字符串函数查看他们答案的第一个字母并将其变为小写。如果他们的答案 == "y"然后玩游戏。我需要帮助将 Yes 的第一个字母小写。
我正在尝试导出我的数据库。我尝试过通过电子邮件并分享它。 问题是我想导出数据库的当前状态(以及其中的所有信息)。 我已经尝试过这段代码: func exportDatabase(){ var
我在分层情况下遇到 getcomponentat 问题。我进行了很多研究,发现以下线程实际上是我需要的,但它对我不起作用。我在线程中下载了代码并且它可以工作但是当我在我的项目中实现它时它没有。我可能正
我有麻烦了。带标题:我不知从哪里得到了 8px 的 margin !我希望我的标题附加到覆盖所有顶部区域而没有边距。但是我只用 margin :-8px; 得到这个东西但是对于不同的屏幕我需要设置其他
我创建了 2 个页脚,第二个页脚使用 css position: absolute 但结果是,第一个页脚不再起作用。 结果是这样的: 最佳答案 请分享您的代码以供理解。 如果您使用的是 positio
我有一个新手问题: bool _isPalindrome(const string& str) { return _isPalindrome(str.begin(), str.end());
我正在尝试构建一个蒙德里安艺术创作器,它允许您创建任意数量的矩形,每个矩形的大小都是随机的。我能够创建随机大小,但我遇到的麻烦是让它创建两个以上的随机矩形。 import turtle import
谁能告诉我为什么以下内容不匹配: >>> re.search(r'(\d{2, 10})', '153') 这个匹配: >>> re.search(r'\d{3}', '153') 最佳答案 re模
我已经为主屏幕构建了一个小部件,并在我的 AppWidgetProvider 类中声明了一些变量。这些变量是整数和 boolean 值。 我遇到的问题(它基本上是一个 Java 编程问题)是我分配给变
我的内存有问题。我不明白为什么当我的程序长时间运行时 Go 使用越来越多的内存(从不释放它)。 第一次分配后,程序使用了将近 9 MB 的内存。然后在 12 小时后,它开始以指数方式使用更多内存,直到
当我使用 g++ 编译以下代码时 class A {}; void foo(A&) {} int main() { foo(A()); return 0; } 我收到以下错误消息: > g++
我正在尝试在我的应用程序中的 iPhone 屏幕上拖动 UIImageView。 目前我设置的拖动功能很好,拖动图像确实可以在屏幕上移动它,问题是你不必拖动 ImageView 来移动它,你也可以在屏
我无法解释这种行为: 有时,我的图表会显示带有大量小数的轴的第一个或最后一个标签。 在我的图表选项中,yAxis 如下所示: yAxis : [{ alternateGridColor: "
我的 update() 函数遇到问题。在这里,在 svg.append('rect') 中,我有 .on('click'),我只需更改数据,然后运行 update(). 为什么这不起作用?我该如何
自从我切换到最近的 emacs 版本 (23.2) 附带的 CEDET 后,CEDET 不再可靠地工作。例如,我无法再重新生成 EDE 项目。 环顾四周后,似乎压缩包中缺少所有 CEDET 模板。有谁
我是一名优秀的程序员,十分优秀!