18

コードの問題をデバッグするために、次の 2 つの文字列が同等であると仮定して宣言しました。

String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
String newPrint = thumbprint.Trim().Replace(" ", "").ToUpper();

私はそうではないことを発見しました。これが私の問題の原因です。ただし、即時ウィンドウ (宣言に続く行) で物事をチェックしていて、何が起こっているのか理解できません。出力は次のとおりです。

print
"8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
newPrint
"‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
String.Compare(print, newPrint);
0
print == newPrint
false
print.Equals(newPrint)
false

は?なぜそれらは等しくないのですか?

編集:

ベースとして「拇印」を使用する必要があります。ユーザーが入力した文字列です。トリミング/上限値を保持する一時変数として「newPrint」を使用しているだけです。print は期待される結果です。

4

3 に答える 3

28

実際、それらは同等ではありません。2 つの値をコピーしたところnewPrint、長さは 41 でしprintたが、長さは 40 でした。 の最初の文字はnewPrintASCII 値 14 の文字です。興味深いことに、これは直接のウィンドウから SO から私の LINQPad に転送されました。

print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14

Trimそれは実際にはandReplace呼び出しとは何の関係もありませんが、ベースとしてではthumbprintなく使用しているという事実とは関係ありません。その追加のキャラクターprintが含まれているとしか思えません。thumbprintどこから来たのかわからない。print代わりに使用するように 2 行目を変更するとthumbprint、期待する結果が得られます。

于 2012-09-13T13:08:53.910 に答える
18

投稿された文字列は同じではありません。これを行うだけです:

string val   = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
string val1  = "‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
var bt = System.Text.Encoding.UTF8.GetBytes(val);
var bt_1 = System.Text.Encoding.UTF8.GetBytes(val1);

2番目の配列には、最初にさらに多くの要素が含まれていることがわかります。

226 
128 
142

この後、3つの要素の内容は等しくなります。

動作する理由は次のString.Compareとおりです。

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

于 2012-09-13T13:11:44.267 に答える
0

質問に何か問題があります。そうでない場合は、pl。MS .NET でこれを試しましたが、Mono では試していないので、完全な環境を指定してください。この方法を試してください: - エラーは発生せず、トレース ステートメントの出力は次のとおりです。

文字列が等しい = True

void TestString()
{
    String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
    String newPrint = print.Trim().Replace(" ", "").ToUpper();
    Trace.TraceInformation("Strings are equal = {0}", (print == newPrint) && (print.Equals(newPrint)));
    Debug.Assert(print == newPrint);
    Debug.Assert(print.Equals(newPrint));
}
于 2012-09-13T13:20:02.017 に答える