【问题标题】:Comparing two strings in if condition yields false unexpectedly C#在 if 条件下比较两个字符串会意外产生 false C#
【发布时间】:2019-10-11 13:40:59
【问题描述】:

我执行模糊搜索,我想确保程序找到了正确的人实例。

因此,我将生成的“lastname firstname”与预期的“lastname firstname”进行比较。

代码比较简单:

string expectedUserName = $"{nameSplit[0].ToLower()} {nameSplit[1].ToLower()}"; // result: "bechtold julian"
string result = O365Api.SearchUser(mail); // result: "bechtold julian"
if (result.Equals(expectedUserName))
{
    // Correct user is found
    // Never enters here
}

为了测试,我还硬编码了期望值:

userName = "bechtold julian";
mail = "julian.bechtold";
string result = O365Api.SearchUser(mail);
if (result.Equals(userName))
{
    // Correct user is found
    // never enters here
}

使用不同的比较方法时结果相同:

if (result == userName)

这里是结果和用户名的值:

我错过了什么吗?来自网络的字符串是否可以包含未显示的特殊字符?

解决问题的后续步骤是什么?

【问题讨论】:

  • 也许其中一个以 ASCII NUL 字符 \0 结尾。两个字符串的长度相同吗?如果您 Encoding.ASCII.GetBytes() 它们返回相同的数组吗?如果你做 a.StartsWith(b) 或 b.StartsWith(a) 其中之一是真的吗? ascii NUL 的问题是,当您查看它时,例如在屏幕截图中,您看不到 nul 或任何代表它的东西。在过去(嗯,即使是现在……但很少遇到)你甚至可以有长度为 7 的“abc\0def”,但它在文本框中看起来像“abc”
  • ==EqualsSystem.String 上是相同的,除非您覆盖 == 运算符。在调试器中切换到十六进制视图
  • 来自网络的字符串可能包含未显示的特殊字符吗? 使用 ToCharArray() 并使用结果编辑问题。

标签: c# string selenium if-statement web-scraping


【解决方案1】:

视觉上无法区分的空白字符(空格、不间断空格)和无法区分的非空白字符(拉丁语 i 和土耳其语 i、v 和 w 在瑞典排序规则中)有时会导致这种情况。

在调试器中切换到十六进制视图以查看实际的字符值。注意终止空字节。

取决于它是什么,

  • 编写一个实用函数来规范化经过经验验证的特殊情况
  • 使用采用CultureInfo 的字符串比较重载之一,并选择不区分重音的文化,例如)

    if (result.Equals(userName, StringComparison.InvariantCulture))
    {
        /* match */
    }
    
  • Trim() 字符串

【讨论】:

  • 谢谢你,成功了。你可能想包括一个例子: if (result.Equals(userName, StringComparison.InvariantCulture))
猜你喜欢
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2016-12-12
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多