【问题标题】:C# string equality operator returns false, but I'm pretty sure it should be true... What?C# 字符串相等运算符返回假,但我很确定它应该是真的......什么?
【发布时间】:2011-02-03 05:18:40
【问题描述】:

我正在尝试为生成大量文本的一段代码编写单元测试。我遇到了一个问题,“预期”和“实际”字符串似乎相等,但 Assert.AreEqual 抛出,并且相等运算符和 Equals() 返回 false。 GetHashCode() 的结果对于两个值也不同。

但是,将两个字符串都放入文本文件并与 DiffMerge 进行比较告诉我它们是相同的。

此外,在两个值上使用Encoding.ASCII.GetBytes(),然后使用SequenceEquals 比较结果字节数组返回true。

每个值都是 34KB,所以我暂时不会把它们放在这里。有任何想法吗?我完全被难住了。

【问题讨论】:

  • 试试Encoding.Unicode.GetBytes()——同样的行为?
  • string.Equals(yourstring, StringComparison.InvariantCulture) 返回什么?
  • 你可以只发布单元测试吗?

标签: c# string equality


【解决方案1】:

您输入 DiffMerge 的文件的编码类型是什么?如果您的字符与编码类型不匹配,那么它们可能不会出现在 DiffMerge 中。

正在生成的字符串和预期的结果可能具有不同的字符编码。当您执行ASCII.GetBytes 时,您将所有内容都转换为 ASCII。因此,您的字符串正在转换为 ASCII 并且就 ASCII 字符集而言是相等的。但是,它们在其他字符集中仍然可能不相等(并且在您看来仍然“看起来”相同)。

另外,请尝试发送string.Compare(str1, str2, StringComparison.XXXX) 并告诉我们会发生什么。

【讨论】:

  • 可能最好的办法是尝试StringComparison.Ordinal
  • 是的,这是一个编码问题……错误的文本是从网页上复制下来的,并且有一些疯狂的引号字符
【解决方案2】:

通过char 循环遍历char 并找到它认为不同的?将其写入磁盘并比较 ASCII / 文本的事实告诉我,它可能与回车/换行相关(在保存过程中以某种方式标准化),或者与某些非 ASCII 字符有关(可能是高- unicode 空格),保存为 ASCII 时会被去掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2014-08-03
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多