1. 程式人生 > >String的幾種比較方法對比(Compare,CompareTo, CompareOrdinal、Equals)

String的幾種比較方法對比(Compare,CompareTo, CompareOrdinal、Equals)

String類字串比較大概有4種方法:Compare(),CompareTo(), CompareOrdinal()和Equals(). Compare()方法是CompareTo()的靜態版本.而Equals()與"=="是等價的,只要使用"=="運算子,就會呼叫Equals()方法.CompareOrdinal()對兩個字串進行比較,不考慮本地化語言和文化。

看測試比較程式碼:

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));
其中,s1和s2分相等和不相等兩種情況. 看結果:

1、Compare會通過傳遞進來的文化資訊來呼叫對應的比較,CompareTo則會呼叫與當前執行緒相關聯的文化資訊,這就意味著,如果我們進行國際化的時候,字串比較必須使用String.Compare靜態方法。而且Compare方法因為是靜態的,要比CompareTo快一些,因為建議儘可能地使用String.Compare方法來代替CompareTo方法!。


2.CompareOrdinal是將整個字串每5個字元(10個位元組)分成一組,然後逐個比較,找到第一個不相同的ASCII碼後退出迴圈。並且求出兩者的ASCII碼的差。不過我很費解的是微軟為什麼要把這個實現的如此麻煩。但是在CLR via C#上有這樣的話:這個方法比其他方法都要快。我想應該是有一定道理的吧。

所以當我們比較大小的時候,儘量使用CompareOrdinal方法。



3.Equals由於是非安全程式碼的比較,所以效率要比我們用安全程式碼高得多。