我正在开发一个函数,它给出了一些设置 - 例如行距,输出(以字符串形式)被修改。为了测试此类场景,我使用字符串文字,如下所示的预期结果。
该方法使用字符串生成器 ( AppendLine) 生成所述输出。我遇到的一个问题是比较这些字符串。在下面的示例中,两者就其所代表的含义而言是相同的。结果是我关心的区域,但是当比较两个字符串时,一个是文字,一个不是,相等自然会失败。这是因为其中一个字符串发出行间距,而另一个字符串仅演示其包含的格式。
解决这个平等问题的最佳方法是什么?我确实关心格式,例如方法结果中的新行,这是至关重要的。
代码:
string expected = @"Test\n\n\nEnd Test.";
string result = "Test\n\n\nEnd Test";
Console.WriteLine(expected);
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)
输出:
测试\n\n\n结束测试。 测试 结束测试
我正在尝试测试类的成员函数的相等性。这是一个小样本:
void main() {
var foo = new Foo();
if (foo.someFunc == foo.someFunc)
print("foo.someFunc == foo.someFunc");
else
print("foo.someFunc != foo.someFunc");
}
class Foo {
someFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印“foo.someFunc!= foo.someFunc”。这里的相等运算符应该测试这些函数是否是内存中的同一对象(看起来它们应该是。)我也尝试使用相同的(foo.someFunc,foo.someFunc),但得到了相同的结果。为什么在这种情况下相等运算符不返回 true?
如果是 JavaScript,/\.scss$/则为正则表达式。我想检查一个正则表达式是否与另一个正则表达式完全相同:
/\.scss$/ === /\.scss$/ // false
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?请注意,我不关心正则表达式匹配什么,我只关心正则表达式的定义方式。
我目前正在研究图形数据类型,在这种情况下,我思考了很多有关身份和平等的语义问题。
我现在的情况如下。我有一个Vertex类型:
final class Vertex<T>: Hashable {
static func ==(lhs: Vertex, rhs: Vertex) -> Bool {
return lhs === rhs
}
var value: T
var hashValue: Int {
return ObjectIdentifier(self).hashValue
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,平等是由身份决定的。我这样做是出于图数据类型特定的原因,但它基本上归结为这样一个事实:顶点应该通过其标识来查看,因此只有当它们是相同(相同)顶点时才被视为相等。
现在哈希值也由身份确定(使用ObjectIdentifier)。这似乎是获取哈希值的最简单方法,并且似乎也与这种类型的相等概念很好地一致。
但这让我思考......
通过属性(如果符合)来确定哈希值在语义上是否“不正确”(或者不合逻辑,value如果你T愿意的话Hashable)。
在这种情况下,两个Vertexs 可以一致地具有相等的哈希值(不仅仅是程序的一次调用),而不被视为相等。这似乎不对。
那么反过来:说实例相等应该意味着它们的哈希值相等是否明智?
我正在尝试创建一个比较两个字符串数组列表的单元测试。
我尝试创建两个完全相同的List<string[]>对象,但是当我使用 时CollectionAssert.AreEqual(expected, actual);,测试失败:
[TestMethod]
public void TestList()
{
List<string[]> expected = new List<string[]> {
new string[] { "John", "Smith", "200" },
new string[] { "John", "Doe", "-100" }
};
List<string[]> actual = new List<string[]> {
new string[] { "John", "Smith", "200" },
new string[] { "John", "Doe", "-100" }
};
CollectionAssert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过Assert.IsTrue(expected.SequenceEqual(actual));,但也失败了。
如果我比较两个字符串列表或两个字符串数组,这两种方法都有效,但在比较两个字符串数组列表时它们不起作用。
我假设这些方法失败,因为它们正在比较两个对象引用列表而不是数组字符串值。
如何比较两个List<string[]>对象并判断它们是否真的相同?
如果两个布尔值相同,则两个布尔值相等,两个数字相似。如果两个集合具有相同的元素,则它们相等。如果检查两组是否相等,我们可以使用以下方案/球拍函数:
\n\n(define (same-set? l1 l2)\n (and (subset? l1 l2) (subset? l2 l1)))\nRun Code Online (Sandbox Code Playgroud)\n\n那么这样的函数是如何自动生成的呢?可以为任意数据类型生成它吗?
\n\n等价关系的基本性质是:
\n\n替换性质:对于任意数量a和b以及任意表达式F(x),如果a = b,则F(a) = F(b)(如果两边都有意义,即格式良好)。\n一些具体例子其中:
\n\n对于任何实数a、b和c,如果a = b,则a + c = b + c(这里F(x)是x + c);
\n\n对于任何实数 a、b 和 c,如果 a = b,则 a \xe2\x88\x92 c = b \xe2\x88\x92 c (这里 F(x) 是 x \xe2\x88\x92 c) ;
\n\n对于任何实数a、b和c,如果a = b,则ac = bc(这里F(x)是xc);
\n\n对于任何实数 a、b 和 c,如果 a = b 且 c 不为零,则 a/c = b/c(此处 F(x) 为 x/c)。 …
我最近开始学习 C#,但陷入了这个特殊情况。是的,我已经检查了前面的问题,但无法弄清楚我的代码中的问题是什么。 自定义类用作字典中的键,但未找到键 这是我能找到的最接近的一个,但此处给出的答案似乎对我不起作用。
我有一个字典注册表<Customers, string>。Customers 是一个具有 2 个字符串的类:s1 和 s2。客户可以匹配 s1 或 s2(两者都不是必需的)。
类客户:
public class Customers
{
public string _s1;
public string _s2;
public Customers(string s1, string s2)
{
_s1 = s1;
_s2 = s2;
}
public class EqualityComparer : IEqualityComparer<Customers>
{
public bool Equals(Customers x, Customers y)
{
Console.WriteLine("Inside Equals");
return ((x._s1.Equals(y._s1)) || (x._s2.Equals(y._s2)));
}
public int GetHashCode(Customers x)
{
return x._s1.GetHashCode() ^ x._s2.GetHashCode();
}
}
}
Run Code Online (Sandbox Code Playgroud)
程序.cs:
Dictionary<Customers, string> registry = new Dictionary<Customers, string>(new Customers.EqualityComparer());
Customers …Run Code Online (Sandbox Code Playgroud) 我有两节课。第一个组成第二个。这两个类都有自己的综合属性,不参与排序或比较。另外,我想使用std::ranges::sort第二个容器,所以我需要实现强排序。这就是我所拥有的:
struct basic
{
std::string synthetized; // string representation of the next field.
unsigned value;
unsigned property;
friend bool operator<(basic const& a, basic const& b)
{ return a.value < b.value or (a.value == b.value and a.property < b.property); }
};
struct composed
{
basic value;
custom_type meta;
friend bool operator<(composed const& a, composed const& b)
{ return a.value < b.value; }
};
int main()
{
std::vector<composed> container;
// populating container
// Compilation error here.
std::ranges::sort(container);
}
Run Code Online (Sandbox Code Playgroud)
我应该如何适当有效地超载operator<=> …
AssertJ的assertThat(...).isEqualTo()方法比较.equals()默认使用。这通常是正确的选择,但有时您确实想通过精确的对象标识/引用标识进行比较(==Java 中的“双等于”,Kotlin 中的“三等于” ===)。
是否有一种惯用的方法来强制 AssertJ 进行这种比较,例如我不知道的断言方法?
我能做的最好的事情就是通过在没有 AssertJ 的情况下进行比较来解决这个问题,然后仅使用它来检查生成的布尔值:
科特林:
assertThat(obj1 === obj2).isTrue()
Run Code Online (Sandbox Code Playgroud)
爪哇:
assertThat(obj1 == obj2).isTrue();
Run Code Online (Sandbox Code Playgroud)
正如我已经暗示的那样,这并不理想,因为 a) 与其他断言相比,它看起来不一致,b) 当断言失败时产生的错误消息只是说“预期为真,结果为假”,这并不像显示的那么好所讨论的不同对象(即使它们仅在内存位置上有所不同,而不是其内容不同)。
我正在尝试检查两个字节数组之间的相等性:我正在运行以下代码:
;; Test 1
(= (byte-array [0 0 0 0])
(byte-array [0 0 0 0])) ;; => false
;; Test 2
(= (seq (byte-array [0 0 0 0]))
(seq (byte-array [0 0 0 0]))) ;; => true
Run Code Online (Sandbox Code Playgroud)
测试 1 失败,但测试 2 通过。这是定义的行为吗?我需要提交错误报告吗?
我期望相等运算符传递这两个断言。