对于具有特殊字符的字符串,C#字符串比较失败

时间:2016-05-17 15:16:52

标签: c# .net regex string

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

我正在将一个字符串传递给一个方法,我需要解析上面的列表&找到是否找到完全匹配。

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

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++;
}

任何人都可以帮助我如何将其合并为一个动态的字符串列表? 注意:我们不能将@与字符串变量连接起来。

使用Regex存在任何方式吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

}

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

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

}

答案 1 :(得分:1)

要获得确切的字符串相等性,您应该使用StringComparer.Ordinal。而且,正如我可以看到你不关心案例,你最好使用StringComparer.OrdinalIgnoreCase

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

答案 2 :(得分:1)

如果你想算一下,只需{i> Linq 的帮助Count();要测试字符串是否相等,请使用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));