2017-07-11 12 views
-2

私はプロジェクトで作業しており、その一部については2つの文字列を比較する必要があります。 私はそれらを比較しようとするたびに、私は常に偽を得る(==, .Equals(), String.Equals() - 完全に同一の2つの文字列を持っていても、それらはすべてfalseを返す)C#String.Equalsは同じ文字列でfalseを返します

ここは私のコードの一部です。 「AutoIncrementTag」 - 私のforeachをデバッグするときに

var tagType = JObject.Parse(json).First.First.ToString(); 
foreach (var type in assembly.ExportedTypes) 
{ 
    var name = tagType; 
    var currentType = type.Name; 

    var a = name.Length; 
    var b = currentType.Length; 

    var result = currentType == name; 
    var result1 = currentType.Equals(name); 
    var result2 = String.Equals(name, currentType, StringComparison.CurrentCulture); 
    var result3 = String.Equals(name, currentType, StringComparison.InvariantCulture); 
    var result4 = String.Equals(name, currentType, StringComparison.Ordinal); 
    var result5 = String.Equals(name, currentType, StringComparison.CurrentCultureIgnoreCase); 
} 

は今、私は最終的には名前とcurrentTypeの両方が同じ文字列に等しい点に到達します。同じ点では、長さ(aとb)は16文字です。

//name -  "AutoIncrementТаg" 
//currentType - "AutoIncrementTag" 

//a - 16 
//b - 16 

// result - false 
// result1 - false 
// result2 - false 
// result3 - false 
// result4 - false 
// result5 - false 

と戻り偽下記の比較のALL:

これは、デバッグ出力は次のようになります。

"name"とcurrenTypeの両方から新しい文字列を作成しようとしました。そして何も。

私は本当にここにこだわっています。どのように2つの同一の文字列(同じ長さ、隠された文字もない)は、あらゆる種類の比較でfalseを返すことができます。

+0

を、文字列が同一ではありません。デバッグ時の結果の価値は? –

+0

検証可能な例を提供できますか?平面コードだけでは、文字列が等しくないようです。 – Link

+0

私の問題を解決するデバッグ出力を表示するために私の投稿を編集しました。私はそれが私の問題を示すことを願っています(値はすべてデバッグウィンドウからコピー/貼り付けされます) – Kobek

答えて

5

最後から二番目と三最後の文字が同じではありません。

最後の2文字目はhttp://www.fileformat.info/info/unicode/char/0061/index.htmで、もう1文字はhttp://www.fileformat.info/info/unicode/char/0430/index.htmです。それらはと同じですが、実際は同じではありません。と同じです。

このプログラムの実行、それを見るために: `String.Equals`がfalseを返した場合

using System; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static string GetEscapeSequence(char c) 
     { 
      return "\\u" + ((int)c).ToString("X4"); 
     } 

     static void Main(string[] args) 
     { 
      var name = "AutoIncrementТаg"; 
      var currentType = "AutoIncrementTag"; 

      foreach (var character in name) 
      { 
       Console.WriteLine(GetEscapeSequence(character)); 
      } 

      Console.WriteLine("second string"); 
      foreach (var character in currentType) 
      { 
       Console.WriteLine(GetEscapeSequence(character)); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 
+0

ありがとうございました。私を助けてくれました。私は私のクラス名を私が持っていたものに改名してしまいました、そして今は正しく動作します – Kobek

+0

これらの種類の問題は本当の頭のスクラッチャーです! – mjwills

-1

コードは大丈夫です。 の名前を比較する前に、現在のタイプを文字列データ型に変換しようとしますか?

String name = tagType; 
      String currentType = type.Name; 

      var a = name.Length; 
      var b = currentType.Length; 
      var result = currentType == name; 

      var result2 = String.Equals(name, currentType, StringComparison.CurrentCulture); 
      var result3 = String.Equals(name, currentType, StringComparison.InvariantCulture); 
      var result4 = String.Equals(name, currentType, StringComparison.Ordinal); 
      var result5 = String.Equals(name, currentType, StringComparison.CurrentCultureIgnoreCase); 
1

2つの文字列については、バイト配列も比較してください。あなたが得るべきだ "AutoIncrementTag" については

string string1 = "AutoIncrementТаg"; 
string charArray = string.Join(",", string1.ToCharArray().Select(s => (int)s)); 

65,117,116,111,73,110,99,114,101,109,101,110,116,1058,1072,103 
+0

彼らは異なって見える。提案していただきありがとうございます。私はそれがなぜ起こっているのかを調べてみます。アイデアありがとう:) – Kobek

+0

私は実際にカットし、悪い文字列を貼り付けている必要があります。 2つの高い数字(1058と1072)は不正な文字でなければなりません。 – Derek

関連する問題