C# String.Equals returns 在相同的字符串上为 false
C# String.Equals returns false on identical strings
我正在做一个项目,其中一部分我需要比较 2 个字符串。
我的问题是,每当我尝试比较它们时,我总是得到假 (==, .Equals(), String.Equals()
- 它们都是 return 假,即使我有 2 个完全相同的字符串)
这是我的部分代码。
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
时,我最终发现 name 和 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
下面的所有比较 return 错误。
我什至尝试用 "name" 和 currenType 创建一个新字符串。什么都没有。
我真的卡在这里了。两个相同的字符串(长度相同,因此没有隐藏字符)怎么会 return 在任何类型的比较中都是假的。
对于两个字符串,还要比较字节数组。
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
倒数第二个和倒数第三个字符不一样。
倒数第二个字符之一是 http://www.fileformat.info/info/unicode/char/0061/index.htm and the other is 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();
}
}
}
我正在做一个项目,其中一部分我需要比较 2 个字符串。
我的问题是,每当我尝试比较它们时,我总是得到假 (==, .Equals(), String.Equals()
- 它们都是 return 假,即使我有 2 个完全相同的字符串)
这是我的部分代码。
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
时,我最终发现 name 和 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
下面的所有比较 return 错误。
我什至尝试用 "name" 和 currenType 创建一个新字符串。什么都没有。
我真的卡在这里了。两个相同的字符串(长度相同,因此没有隐藏字符)怎么会 return 在任何类型的比较中都是假的。
对于两个字符串,还要比较字节数组。
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
倒数第二个和倒数第三个字符不一样。
倒数第二个字符之一是 http://www.fileformat.info/info/unicode/char/0061/index.htm and the other is 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();
}
}
}