String.CompareOrdinalメソッドは、Compareメソッド同様に文字列の比較を行う静的メソッドですが、比較の際に文字列の各文字を数値(Unicode序数、Unicode ordinal)、つまり各文字のコードポイントでの比較を行う点で動作が異なります。
Compareメソッドでオプションを特に指定しない場合、現在のスレッドの(もしくは引数で指定された)カルチャの規則にしたがった比較を行うのに対し、CompareOrdinalメソッドでは常にカルチャに依存しない比較が行われます。
String.CompareOrdinalメソッドでコードポイントによって文字列を比較する
Imports System
Class Sample
Shared Sub Main()
Dim p1 As String() = New String() {"abc", "abd"}
Dim p2 As String() = New String() {"coop", "co-op"}
Dim p3 As String() = New String() {"cant", "can't"}
Console.WriteLine("Compare ({0}, {1}) : {2}", p1(0), p1(1), String.Compare(p1(0), p1(1)))
Console.WriteLine("CompareOrdinal({0}, {1}) : {2}", p1(0), p1(1), String.CompareOrdinal(p1(0), p1(1)))
Console.WriteLine("Compare ({0}, {1}) : {2}", p2(0), p2(1), String.Compare(p2(0), p2(1)))
Console.WriteLine("CompareOrdinal({0}, {1}) : {2}", p2(0), p2(1), String.CompareOrdinal(p2(0), p2(1)))
Console.WriteLine("Compare ({0}, {1}) : {2}", p3(0), p3(1), String.Compare(p3(0), p3(1)))
Console.WriteLine("CompareOrdinal({0}, {1}) : {2}", p3(0), p3(1), String.CompareOrdinal(p3(0), p3(1)))
End Sub
End Class
実行結果
Compare (abc, abd) : -1 CompareOrdinal(abc, abd) : -1 Compare (coop, co-op) : -1 CompareOrdinal(coop, co-op) : 66 Compare (cant, can't) : -1 CompareOrdinal(cant, can't) : 77
CompareメソッドとCompareOrdinalメソッドで大小関係が反転している箇所に注目してください。
CompareTo・Compare・Equalsの各メソッドでも、StringComparisonを指定することによってCompareOrdinalメソッドと同様の比較方法を使用するように指定できます。 これについては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型とStringComparerクラスで詳しく説明しています。