String的幾種比較方法對比(Compare,CompareTo, CompareOrdinal、Equals)
阿新 • • 發佈:2019-02-10
String類字串比較大概有4種方法:Compare(),CompareTo(), CompareOrdinal()和Equals(). Compare()方法是CompareTo()的靜態版本.而Equals()與"=="是等價的,只要使用"=="運算子,就會呼叫Equals()方法.CompareOrdinal()對兩個字串進行比較,不考慮本地化語言和文化。
看測試比較程式碼:
其中,s1和s2分相等和不相等兩種情況. 看結果:const int Num = 10000000; string s1 = "abcdefgh"; string s2 = "abcdefgh"; //string s1 = "abcdefgh"; //string s2 = "amklklkl"; int end; //Compare int start = Environment.TickCount; for (int i = 0; i < Num; i++) { string.Compare(s1, s2); } end=Environment.TickCount; Console.WriteLine("Compare : " + (end - start)); //CompareTo start = Environment.TickCount; for (int i = 0; i < Num; i++) { s1.CompareTo(s2); } end = Environment.TickCount; Console.WriteLine("CompareTo : " + (end - start)); //CompareOrdinal start = Environment.TickCount; for (int i = 0; i < Num; i++) { string.CompareOrdinal(s1, s2); } end = Environment.TickCount; Console.WriteLine("CompareOrdinal : " + (end - start)); //靜態Equals start = Environment.TickCount; for (int i = 0; i < Num; i++) { string.Equals(s1, s2); } end = Environment.TickCount; Console.WriteLine("靜態Equals : " + (end - start)); //例項Equals start = Environment.TickCount; for (int i = 0; i < Num; i++) { s1.Equals(s2); } end = Environment.TickCount; Console.WriteLine("例項Equals : " + (end - start));
1、Compare會通過傳遞進來的文化資訊來呼叫對應的比較,CompareTo則會呼叫與當前執行緒相關聯的文化資訊,這就意味著,如果我們進行國際化的時候,字串比較必須使用String.Compare靜態方法。而且Compare方法因為是靜態的,要比CompareTo快一些,因為建議儘可能地使用String.Compare方法來代替CompareTo方法!。
2.CompareOrdinal是將整個字串每5個字元(10個位元組)分成一組,然後逐個比較,找到第一個不相同的ASCII碼後退出迴圈。並且求出兩者的ASCII碼的差。不過我很費解的是微軟為什麼要把這個實現的如此麻煩。但是在CLR via C#上有這樣的話:這個方法比其他方法都要快。我想應該是有一定道理的吧。
所以當我們比較大小的時候,儘量使用CompareOrdinal方法。
3.Equals由於是非安全程式碼的比較,所以效率要比我們用安全程式碼高得多。