问题标签 [equals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
13755 浏览

sql - SQL JOIN:ON vs Equals

以下有什么显着区别吗?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

SO 用户是否偏好其中之一?

0 投票
3 回答
17748 浏览

c# - C# 中基于接口编程的运算符重载

背景

我在当前项目中使用基于接口的编程,并且在重载运算符(特别是 Equality 和 Inequality 运算符)时遇到了问题。


假设

  • 我正在使用 C# 3.0、.NET 3.5 和 Visual Studio 2008

更新 - 以下假设是错误的!

  • 要求所有比较都使用 Equals 而不是 operator== 不是一个可行的解决方案,尤其是在将类型传递给库(例如 Collections)时。

我担心要求使用 Equals 而不是 operator== 的原因是,我在 .NET 指南中找不到任何地方表明它将使用 Equals 而不是 operator== 甚至建议使用它。但是,在重新阅读了覆盖等于和运算符 == 的指南后,我发现了这一点:

默认情况下,运算符 == 通过确定两个引用是否指示同一个对象来测试引用是否相等。因此,引用类型不必实现 operator == 即可获得此功能。当类型是不可变的,即实例中包含的数据不能更改时,重载运算符 == 来比较值相等而不是引用相等可能很有用,因为作为不可变对象,它们可以被视为与 long 相同因为它们具有相同的价值。在非不可变类型中覆盖 operator == 不是一个好主意。

和这个Equatable Interface

IEquatable 接口由通用集合对象(例如 Dictionary、List 和 LinkedList)在 Contains、IndexOf、LastIndexOf 和 Remove 等方法中测试相等性时使用。应该为可能存储在通用集合中的任何对象实现它。


约束

  • 任何解决方案都不得要求将对象从它们的接口转换为它们的具体类型。

问题

  • 当 operator== 的两边都是接口时,没有来自底层具体类型的 operator== 重载方法签名将匹配,因此将调用默认的 Object operator== 方法。
  • 在类上重载运算符时,二元运算符的至少一个参数必须是包含类型,否则会产生编译器错误(错误 BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx )
  • 无法在接口上指定实现

请参阅下面演示该问题的代码和输出。


问题

在使用基于接口的编程时,如何为类提供适当的运算符重载?


参考

== 运算符(C# 参考)

对于预定义的值类型,相等运算符 (==) 如果其操作数的值相等则返回 true,否则返回 false。对于字符串以外的引用类型,== 如果它的两个操作数引用同一个对象,则返回 true。对于字符串类型,== 比较字符串的值。


也可以看看


代码


输出

0 投票
5 回答
1386 浏览

c# - C#中具有双向关联的价值平等

背景

在我正在处理的 C# 项目中,我有两个对象之间具有双向关联。由于多种原因(例如,在集合中使用它们),我需要能够检查值相等(与引用相等),因此我正在实现 IEquatable 和相关功能。

假设

  • 我正在使用 C# 3.0、.NET 3.5 和 Visual Studio 2008(尽管对于相等比较例程问题应该无关紧要)。

约束

任何解决方案都必须:

  • 允许双向关联保持不变,同时允许检查值相等。
  • 允许类的外部使用从 IEquatable 调用 Equals(Object obj) 或 Equals(T class) 并接收正确的行为(例如在 System.Collections.Generic 中)。

问题

在实现 IEquatable 以检查具有双向关联的类型的值相等时,会发生无限递归,从而导致堆栈溢出。

注意:类似地,在 GetHashCode 计算中使用类的所有字段将导致类似的无限递归和堆栈溢出问题。


问题

如何检查两个具有双向关联的对象之间的值相等而不导致堆栈溢出?


代码

注意:此代码仅用于显示问题,而不是演示我正在使用的遇到此问题的实际类设计

0 投票
9 回答
34391 浏览

java - 在 Java 中比较字符、整数和类似类型:使用等于或 ==?

我想确定 Java 中的某些内容:如果我有一个 Character 或 Integer 或 Long 之类的东西,我应该使用 equals 还是 == 就足够了?

我知道对于字符串,不能保证每个唯一字符串只有一个实例,但我不确定其他盒装类型。

我的直觉是使用equals,但我想确保我没有浪费性能。

0 投票
2 回答
1707 浏览

nhibernate - 在NHibernate中覆盖==(相等)运算符?

使用 NHibernate 实体,您需要覆盖 Equals 和 GetHashCode。重写 == 运算符以使用 .Equals 实现是一个好主意吗?

0 投票
1 回答
5041 浏览

c# - Assert.ReferenceEquals() 在 Visual Studio 测试中传递 Object.ReferenceEquals() 返回“false”的位置

在尝试在 Visual Studio Professonal 2008 的测试功能中创建初始失败的单元测试时,当对象实例等于空引用时,我似乎Assert.ReferenceEquals()无法正确失败。请注意,对于相同的比较,它正确返回。object.ReferenceEquals()false

这是我的课程代码:

然后这里是我的测试课的关键方面:

请注意,该static void Startup(object)方法是空的,因此该static object TheObject属性永远不会设置并保持不变null。所以,显然,Assert.ReferenceEquals(obj, Project.TheObject)应该失败,但不知何故,这个测试通过了。

注意改变

Assert.ReferenceEquals(obj, Project.TheObject)

Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))

导致此测试正确失败。

这似乎太简单了,但我看不出这里出了什么问题。如果有人能以我的方式指出错误,我将不胜感激。

提前致谢,

麦克风

詹姆斯艾弗里回答的更新:

啊,我现在感觉多么愚蠢。我知道它必须是这样的。哇。

果然,“GoToDefinition”将我带到“Object.ReferenceEquals()”。所以键入“Assert.ReferenceEquals()”实际上是 System.Object.ReferenceEquals(),在我的例子中它悄悄地返回“false”。当然,这与实际失败的断言无关,因此测试通过。惊人的。

谢谢詹姆斯。

0 投票
2 回答
2201 浏览

c# - C# Assert.AreNotEqual 与 Equals

在尝试向自己验证时,IEnumerables 的 C# Equals 是一个引用 equals,我发现了一些奇怪的东西。在 NUnit 中进行以下设置

这个测试

通过,而这个测试

没有。谁能解释为什么?

编辑:感谢您的回答。我刚刚阅读了 NUnit 的文档,它说了同样的话,即带有集合的 AreEqual 和 AreNotEqual 测试集合中每个元素的相等性。我想我被这个概念困住了,AreEqual 和 AreNotEqual 只是使用普通的 Equals。

0 投票
6 回答
5874 浏览

c# - 覆盖 Equals 并与字符串进行比较

我已经定义了一个带有字符串成员的 C# 类。出于所有目的,将此类视为字符串的子类(除非这是不允许的)。我用它来表示一个与特定格式匹配的强类型字符串字段(我已经大大简化了这一点)。

现在,我希望能够将此类直接与任何其他字符串(对象或文字)进行比较。因此,我在课堂上实现了以下内容:

现在,当我编写单元测试时,根据我将参数传递给 Assert.AreEqual 的顺序,我会得到不同的结果:

我假设这是因为在第一个断言中,它调用了 field.Equals(),而在第二个断言中,它调用了 String.Equals()。显然我从错误的角度来处理这个问题。谁能给我一些见解?

另一件事。我不能在这里使用结构(值类型),因为在我的实际情况下,我在基类中定义所有这些并从它继承。

0 投票
19 回答
367702 浏览

c# - == 和 Equals() 之间的 C# 区别

我在比较 2 个字符串的 silverlight 应用程序中有一个条件,由于某种原因,当我使用==它时返回false.Equals()返回true

这是代码:

为什么会发生这种情况?

0 投票
5 回答
5674 浏览

c# - 如何检查 c# 中的两个值是否相等?(给定任何类型的值)

我在这里有这段代码,旨在允许任何类型的参数:

如果我使用几个整数来调用它,它的行为就不会很好。