2017-07-11 43 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

相关问题