【问题标题】:C# String comparison fails for string having special character in it [closed]对于其中包含特殊字符的字符串,C# 字符串比较失败 [关闭]
【发布时间】:2016-05-17 15:16:52
【问题描述】:

我有一个字符串列表,其中包含一些带有一些特殊字符的字符串,例如 -、[、]、(、)。

我正在将一个字符串传递给一个方法,我需要在该方法中解析上述列表并查找是否找到了完全匹配的内容。

为此,我编写了以下代码,但是当字符串中出现特殊字符时,它无法进行比较。

foreach (var item in myList)
{
    if (myInput.Trim().ToUpper() == item.Trim().ToUpper() ) //Here myInput is "In - Com [SP]"
    {
        count++;
    }

}

但是,如果我通过前面的 @ 符号比较静态字符串,那么比较工作正常。例如:

if (item == @"In - Com [SP]")
{
    count++;
}

谁能帮我把它合并成一个动态的字符串列表? 注意:我们不能将 @ 与字符串变量连接起来。

使用正则表达式有什么方法吗?

【问题讨论】:

  • 您需要告诉我们myInputmyList 中的内容。
  • 字符串比较一般使用Equals()方法。 Check here for the differences
  • @" 字符串打开器指示字符串忽略转义字符,例如 \n 这将是换行符,它对字符串比较没有影响,在这种情况下,问题可能出在您的字符串中
  • 尝试添加 Console.WriteLine("\""+myInput.Trim().ToUpper()+"\" \"" +item.Trim().ToUpper()+"\""); 这会让您更好地了解正在比较的内容

标签: c# .net regex string


【解决方案1】:

我无法告诉您为什么您的版本无法正常工作,除非在比较字符串时存在一些不寻常的换行符或其他虚假字符会造成问题。 (例如,如果 unix 行结尾或其他不寻常的字符以某种方式出现在您看不到的字符串中,则可能会发生这种情况)

我会尝试对 String 使用静态 Compare 方法,其中 true 参数将比较字符串,忽略大小写:

foreach (var item in myList)
{
    if (String.Compare(myInput.Trim(), item.Trim(), true) == 0)
    {
        count++;
    }

}

更新:阅读 cmets 后,Draken 建议使用字符串 Equals 方法。

foreach (var item in myList)
{
    if (myInput.Trim().Equals(item.Trim(), StringComparison.OrdinalIgnoreCase))
    {
        count++;
    }

}

【讨论】:

  • 不,当字符串中出现特殊字符(待比较)时,它无法与上述方法进行比较。 :(
  • 只有这样(通过附加@符号),它才能工作...... if (item == @"In - Com [SP]") { count++; }
  • @Biki,你用调试器能找到什么吗?或者我会尝试的另一件事是将字符串的每个版本粘贴到 Notepad ++ 或类似文件中。然后,您可以转到菜单视图 > 显示符号 > 显示所有字符。至少当你的问题发生在我身上时,我发现这是 Unicode 和 ASCII 字符之间的区别。另请查看stackoverflow.com/a/15259355/5889360,因为如果有字符可以不用,您或许可以使用本文来帮助找到解决方案。
【解决方案2】:

对于精确的字符串相等,您应该使用StringComparer.Ordinal。而且,我可以看到你不关心大小写,你最好使用StringComparer.OrdinalIgnoreCase

if(StringComparer.OrdinalIgnoreCase.Equals(myInput.Trim(), item.Trim()))
{
    count++;
}

【讨论】:

  • 不,当字符串中出现特殊字符(待比较)时,它无法与上述方法进行比较。 :(
【解决方案3】:

如果你想数数,只需 Count()Linq 的帮助下;测试字符串是否相等使用String.Equals:

System.Linq;
...
// do not do Trim() repeatedly
String testValue = myInput.Trim();

int count = myList
  .Count(item => String.Equals(item.Trim(), 
                               testValue,
                               StringComparison.OrdinalIgnoreCase));

【讨论】:

  • 如果您要将它们从纯 c# 转移到 linq,那么您需要确保他们知道他们需要包含 Linq 库
  • Thx,但问题不在于做同样事情的不同方法,但我发现 String.Equals() 当特殊字符出现在您的示例中的项目或 testValue 中时不起作用。您可以尝试将“In - Com [SP]”作为两个字符串进行比较,看看它是否有效。
猜你喜欢
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多