2012-02-13 207 views
3

在很多地方我使用==運算符來比較字符串,現在我知道這是考慮套管...有無論如何我可以調整文化設置以避免這種情況或做我必須去的每一行代碼並將其更改爲全局覆蓋==運算符

string.Compare(a,b,StringComparison.CurrentCultureIgnoreCase) 
+0

你可以做一個擴展方法。 – cadrell0 2012-02-13 19:27:42

+4

雖然我認爲你可以重寫functionallity,但它可能會使下一個人難以閱讀代碼並真正看到發生了什麼。我建議使用擴展方法來比較字符串,並且相應地更新所有代碼。 – cgatian 2012-02-13 19:28:15

+0

您將無法重寫字符串的行爲。此外,你應該知道更好的然後使用==,因爲它不會比較兩個字符串,看看它們是否相等。使用擴展方法確實不適合這種情況。 – 2012-02-13 19:28:57

回答

5

怎麼樣一個字符串的擴展方法?:

public static class StringExtensions { 
    public static bool EqualsIC(this string self, string string1) { 
     return self.Equals(string1, StringComparison.InvariantCultureIgnoreCase);   
    } 
} 

然後,你可以使用

string string1 = "Hello world"; 
string string2 = "hEllO WOrLD"; 
bool theymatch = string1.EqualsIC(string2); 

// OR (per TimS' comment) - to avoid error if string1 is null 
theymatch = StringExtensions.EqualsIC(string1, string2); 

作爲一個深奧的替代方法,您可以使用正則表達式,而不是String.Compare的:

public static bool EqualsICRX(this string self, string string1) { 
    return Regex.IsMatch(string1, "^" + self + "$", RegexOptions.IgnoreCase); 
} 
+0

這將是更好的使用string.Equals(...)而不是string.Compare(...)== 0. – 2012-02-13 19:34:43

+0

@TimS。好決定。改變... – 2012-02-13 19:37:39

+2

嗯..有一點要記住,你現在是怎麼做的,如果'self'爲null,這段代碼會拋出一個錯誤。如果你改用靜態方法,'string.Equals(self,...',你將會有更類似於'=='運算符的行爲,即空值不會導致錯誤。 – 2012-02-13 19:51:45

1

==對字符串從未考慮文化,所以你必須去改變它。

字符串==實際上是基於僅在碼點完成的,所以字符串可以期待即使當相同的(例如,如果一個已經由字符和其它分解)不同。一般來說,你想要一個更加複雜的'平等'概念。

"é" == "é" 
== False