web-dev-qa-db-ja.com

文字列の比較と個々の文字のアルファベット順

文字列の比較と文字の比較に関する質問があります。

文字_>_および_0_(ゼロ)の10進値は_62_および_48_です。

次のコードで2つの文字を比較すると、値True(正しい)が得られます。

_Console.WriteLine('>' > '0');
_

次のコードで2つの1文字の文字列を比較すると、値_-1_が得られます。これは、">"が "0"(デフォルトのカルチャは英語)未満であることを示します。

_Console.WriteLine(string.Compare(">", "0"));
_

一方、次のコードの「3」と「1」(_51_と_49_のコード値)を比較すると、_1_が返されます(予想どおり)

_Console.WriteLine(string.Compare("3", "1"));
_

また、string.Compare(string str1, string str2)ドキュメントには次のように書かれています。

比較では、現在のカルチャを使用して、大文字と小文字の規則や個々の文字のアルファベット順などのカルチャ固有の情報を取得します。

文字列比較がどのように実装されているかを説明(またはいくつかのドキュメントへの参照を提供)できますか?どのように個々の文字のアルファベット順は計算されますか?

17
Alexandar

文字を比較すると'>'および'0'、あなたはそれらの順序値を比較しています。

文字列比較から同じ動作を取得するには、序数の文字列比較タイプを指定します。

  Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal));
  Console.WriteLine(string.Compare(">", "0", StringComparison.InvariantCulture));
  Console.WriteLine(string.Compare(">", "0", StringComparison.CurrentCulture));

現在のカルチャはデフォルトで使用されます。これは、アルファベット順の定義のために、厳密な辞書順ではなく「アルファベット順」で文字列をソートすることを目的としたソート順を持っています。

19
Pete Kirkham

文字列の並べ替え順序は、使用するカルチャによって異なります。

StringComparer.CurrentCulture 私のマシンでは、次の1文字の文字列を次のように並べ替えます。

' -   ! " # $ % & (  ) * , . / : ; ? @ [
\ ] ^ _ ` { | } ~ +  < = > 0 1 2 3 4 5 6
7 8 9 a A b B c C d  D e E f F g G h H i
I j J k K l L m M n  N o O p P q Q r R s
S t T u U v V w W x  X y Y z Z

StringComparer.Ordinal 同じ文字列を次のように並べ替えます。

  ! " # $ % & ' ( )  * + , - . / 0 1 2 3
4 5 6 7 8 9 : ; < =  > ? @ A B C D E F G
H I J K L M N O P Q  R S T U V W X Y Z [
\ ] ^ _ ` a b c d e  f g h i j k l m n o
p q r s t u v w x y  z { | } ~
23
dtb

あなたが望むのは、文化固有のルールを使用しないことの比較であるように思えます。 StringComparison.Ordinalを試しましたか:

Console.WriteLine( string.Compare( ">", "0", StringComparison.Ordinal ) ); // returns a positive number
2
Oren Melzer

-1str2と比較しているため、str1を返しますが、その逆ではありません。例:「48は62に等しい」。いいえ、62未満なので、-1を返します。パラメータの順序を読むと、意味的に少し混乱します

0
DiskJunky