19

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

文字>0(ゼロ)には、それに応じて次の10進値が62あり48ます。

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

Console.WriteLine('>' > '0');

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

Console.WriteLine(string.Compare(">", "0"));

一方、次のコードの「3」と「1」(51および49コード値)を比較すると、 1(予想どおり)が返されます。

Console.WriteLine(string.Compare("3", "1"));

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

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

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

4

4 に答える 4

24

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

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 { | } ~
于 2013-02-19T21:25:05.067 に答える
23

文字'>'とを比較すると'0'、それらの順序値が比較されます。

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

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

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

于 2013-02-19T21:23:41.320 に答える
4

文化固有のルールを使用しない場合の比較が必要なようです。StringComparison.Ordinalを試しましたか:

Console.WriteLine( string.Compare( ">", "0", StringComparison.Ordinal ) ); // returns a positive number
于 2013-02-19T21:26:19.603 に答える
1

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

于 2013-02-19T21:12:01.983 に答える