2009-02-02 46 views
13

假設我有兩個字符串:a和b。爲了比較是否並有當情況被忽略,我一直使用相同的價值觀:在C中無情地比較字符串#

// (Assume a and b have been verified not to be null) 

if (a.ToLower() == b.ToLower()) 

然而,使用反射,我已經在.NET Framework看到這幾次:

// (arg three is ignoreCase) 

if (string.Compare(a, b, true) == 0) 

我測試哪個更快,並且ToLower()每次用我使用的字符串擊敗Compare()

請問Compare()而不是ToLower()的原因是什麼?關於不同的CultureInfo?我在撓頭。

回答

7

MSDN article的備註部分應該解釋一些事情。基本上,原因是不同文化背景下的兼容性。

0

ToLower()不是比較函數,它將字符串設置爲小寫。當在C#中的String對象上使用==運算符時,它會被編譯器優化。在覈心上,兩者都依賴於System.String.Equals,如Reflector所示。

+0

他意味着ToLower()示例擊敗了(顯式的)Compare()示例。 – strager 2009-02-02 00:36:18

+0

@克里斯,國際化可能在此發揮作用。 – strager 2009-02-02 00:37:14

+0

好的,那麼string.Compare(a.ToLower(),b.ToLower())比string.Compare(a,b,true)要快。 – core 2009-02-02 00:37:50

22

你應該關心的主要問題是不是性能,它的正確性,並從該方面的方法你可能要使用的區分大小寫的比較可以是:

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0; 

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

(如果你知道字符串可能爲空第一種是有用的;後者則是簡單的寫,如果你已經知道至少一個字符串非空我從來沒有測試的性能,但假定它會是相似的)

OrdinalOrdinalIgnoreCase是一個安全的賭注,除非你知道你想使用另一種比較方法。得到所需的信息做出決定read this article on MSDN

3

當比較字符串時,您應該使用顯式的StringComparison成員總是。字符串函數在選擇比較字符串的方式上有些不一致。保證比較的唯一方法是a)記住所有這些(包括你和團隊中的每個人)或者b)對每個功能使用明確的比較。

明確而不依賴羣體知識是完美的要好得多。你的隊友會爲此感謝你。

例子:

if (StringComparison.OrdinalIgnoreCase.Equals(a,b)) 

使用ToLower將比較有2個問題,我能想到的把我的頭

  1. 它分配內存的頂部。比較函數不應該分配內存,除非它們絕對必須。
  2. 可以通過多種方式降低字符串。最顯着的序數或文化敏感度較低。 .ToLower()的工作方式是?就我個人而言,我不知道。傳遞明確的文化比依靠默認更好。
0

莫非自己信息的測試顯示ToLower將調用()比不區分大小寫的更快比較呢?我的測試表明情況正好相反!無論如何,其他海報關於正確性的觀點仍然存在。