2016-05-17 175 views
-4

我有一個字符串列表,其中包含一些特殊字符(如 - ,[,],(,))的少數字符串。C#字符串比較失敗,其中包含特殊字符的字符串

我傳遞一個字符串到一個方法,我需要解析上面的列表&找到是否找到完全匹配。

爲此,我編寫了下面的代碼,但是如果字符串中存在特殊字符,則無法進行比較。

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

任何人都可以請幫助我如何將這個動態列表的字符串? 注意:我們無法連接@和一個字符串變量。

通過使用正則表達式的任何方式?

+5

請提供多一點的[MCVE] –

+2

你需要告訴我們什麼是在'myInput'和'myList'。 –

+2

字符串比較通常應該使用'Equals()'方法完成。 [檢查這裏的差異](http://stackoverflow.com/questions/44288/differences-in-string-compare-methods-in-c-sharp) – Draken

回答

1

我不能告訴你爲什麼你的版本不工作,除非有一些不尋常的換行符或其他虛假字符在比較字符串時產生問題。 (這可能發生,例如,如果一個unix行結束或其他不尋常的字符在某種程度上是你看不到的字符串)

我會嘗試使用靜態比較方法的字符串,其中真正的參數將比較字符串,忽略case:

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

} 
+0

不可以,當字符串中存在特殊字符時它不能與上述方法進行比較。:( – Biki

+0

只有這樣(通過應用程序結束@符號),它的工作原理...if(item == @「In - Com [SP]」) count ++; } – Biki

+0

@Biki,當你使用調試器時你能找到什麼嗎?或者我想嘗試的另一件事是將每個版本的字符串粘貼到Notepad ++或類似的。然後,您可以進入菜單視圖>顯示符號>顯示所有字符。至少當你的問題發生在我身上時,我發現它是Unicode和ASCII字符之間的區別。另外請查看http://stackoverflow.com/a/15259355/5889360,因爲如果有沒有字符,您可以使用這篇文章來幫助找到解決方案。 –

1

對於確切的字符串相等,您應該使用StringComparer.Ordinal。而且,我可以看到你不關心的情況下,最好讓你使用StringComparer.OrdinalIgnoreCase

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

不可以,當字符串中存在特殊字符(待比較)時,不能與上述方法進行比較。 :( – Biki

1

如果你想算,只是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)); 
+0

如果你打算將它們從純C#轉換到LINQ,那麼你需要確保他們知道他們需要Linq庫包括 – MikeT

+0

Thx,但問題不在於用同樣的方法做不同的方法,而是我發現String.Equals()在你的例子中的item或testValue中存在特殊字符時不起作用,你可以嘗試比較「In - Com [SP]」作爲字符串並查看它是否工作。 – Biki