2017-07-11 51 views
-2

我的一個項目和它的一部分,我需要比較兩個字符串工作假的。 我的問題是,每當我嘗試比較它們時,我總是會得到錯誤(==, .Equals(), String.Equals() - 即使我有2個完全相同的字符串,它們都會返回false。)C#String.Equals返回上相同的字符串

這是我的代碼的一部分。

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); 
} 

現在調試我foreach的時候,我最終會達到一個點,名稱和currentType都等於相同的字符串 - 「AutoIncrementTag」。在同一點,它們的長度(a和b)相等 - 16個字符。

這是調試輸出的樣子:

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

//a - 16 
//b - 16 

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

攀比和所有下面返回FALSE。

我甚至嘗試創建一個新的串出既有「名」和currenType的。沒事了。

我真的被困在這裏。兩個相同的字符串(相同的長度,所以沒有隱藏的字符)如何可以通過任何比較返回false。

+0

如果'String.Equals'返回false,字符串是不相同的。調試結果的價值是什麼? –

+0

你能提供一個可驗證的例子嗎?只是通過平面代碼,看起來你的字符串不相等。 – Link

+0

剛剛編輯我的帖子以顯示麻煩我的調試輸出。我希望它能說明我的問題。 (這些值都是從調試窗口複製/粘貼的) – Kobek

回答

5

倒數第二和倒數第三個字符是不一樣的。

一個倒數第二個字符是http://www.fileformat.info/info/unicode/char/0061/index.htm,另一個是http://www.fileformat.info/info/unicode/char/0430/index.htm。他們看起來一樣,但實際上並不相同。

要看到它,運行這個程序:

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

代碼似乎沒事。你可以嘗試比較之前轉換currentType變量字符串數據類型。

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

對於兩個字符串,還要比較字節數組。

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

對於 「AutoIncrementTag」 你應該得到:

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

它們看起來不一樣。感謝您的建議。我會試着找出原因。感謝您的想法:) – Kobek

+0

我實際上必須剪下和粘貼壞字符串。兩個高數字(1058和1072)必須是不好的字符。 – Derek

相關問題