2012-02-13 110 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