- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
StringComparer.InvariantCultureIgnoreCase Equals 对“”与“\0”返回 true,但 GetHashCode 对两个字符串返回不同的值。这是错误吗?
var sc = StringComparer.InvariantCultureIgnoreCase;
string s1 = "";
string s2 = "\0";
Console.WriteLine( sc.Equals(s1, s2) );
Console.WriteLine( sc.GetHashCode(s1) );
Console.WriteLine( sc.GetHashCode(s2) );
返回
True
0
-1644535362
我认为 GetHashCode 应该为“相等”字符串返回相同的值,这是一个错误吗?
最佳答案
这 2 个字符串按位不相等。它们有 2 种不同的长度。因此,哈希码算法在这里是合理的。
字符串比较算法在进行比较时必须忽略 \0
。我 looked into the source : 它正在执行某种加/减比较算法以查明情况是否不同。
GetHashCode
仅表示值可能 相等,但不一定相等。反之并不总是正确的,您可以覆盖任何类型的 ==
运算符或 .Equals
并让它在哈希码时生成 true
不同意。
这是 GetHashCode
.看起来它正在使用原始字节进行计算。
您可能无意中发现了 .NET 库中的一个不起眼的错误,但我猜这是一种边缘情况。
再一次 - 你正在使用一个字符串比较器。不是 string.Equals
方法或 string.GetHashCode
。请注意 Console.WriteLine("\0".Equals(""));
生成 false
。
如果您想要一个能让它同意的字符串比较器,我相信
看起来两者都采用了相同的字符比较方法。 StringComparer.OrdinalIgnoreCase
可以解决问题,因为它会分别查看每个字符,而不是对值进行整理。
关于c# - StringComparer.InvariantCultureIgnoreCase Equals vs GetHashCode 不同意相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54243461/
如果我想要一个不区分大小写的字符串键控字典,在给定这些约束的情况下,我应该使用哪个版本的 StringComparer: 字典中的键来自 C# 代码或仅以英语语言环境(美国或英国)编写的配置文件 软件
为什么 String.IndexOf(String, StringComparison)需要 StringComparison并且不允许更一般的StringComparer ,甚至只是 ICompar
某些 .NET 方法使用 StringComparison作为参数,有些使用 StringComparer (通常采用 IComparer 的形式)。差异是显而易见的。是否有一些优雅的方法如何从 St
我有一个 UTF-8 字符串列表,我想使用 Enumerable.OrderBy 对其进行排序.字符串可能包含任意数量的字符集 - 例如,英语、德语和日语,或者它们的混合,甚至。 例如,这是一个示例输
我有一个带有街道名称的 SortedList Dim orderedListStreet As New Generic.SortedList(Of String, String)(StringComp
我正在寻找一个具有支持通配符 (*) 和大小写敏感的 StringComparer 的快速 .NET 类/库。有什么想法吗? 最佳答案 您可以将 Regex 与 RegexOptions.Ignore
我正在尝试序列化/反序列化字典,问题是我用 StringComparer.OrdinalIgnoreCase 创建字典比较器。 这是我遇到的问题的代码片段: var dict = new Dictio
我正在尝试为 .Net core 1.0 重新定位一个可移植的 C# 库。 一旦我获得了该语言的 CultureInfo 对象(通过调用者设置的委托(delegate)),我曾经做过类似的事情来获得该
我需要使用全局化规则来搜索文档中出现的所有字符串。伪代码是: var searchText = "Hello, World"; var compareInfo = new CultureInfo("e
.NET5 的新手,所以不确定这是否简单。我的解决方案中还有 5 个其他项目,它们都在 project.json 文件中有这个 "frameworks": { "net5": { } } 我需
我一直在使用 StringComparer.CurrentCultureIgnoreCase用于不区分大小写的比较和散列。但是在检查了引用源之后,我看到它在每次调用时都会创建一个新实例(那么它不应该是
StringComparer.InvariantCultureIgnoreCase Equals 对“”与“\0”返回 true,但 GetHashCode 对两个字符串返回不同的值。这是错误吗? v
这两个类有什么区别? 我使用了 System.StringComparer.OrdinalIgnoreCase() 和 System.StringComparison.OrdinalIgnoreCas
我想用 Frama-c 和 WP 插件来表示,下面编写的 stringCompare 函数充当“它应该”的作用 - 即:给定相同的输入字符串,该函数返回 0 并且结果不同于 0如果字符串不相同。我已经
我在我的数据库和我的 C# 代码之间实现了一个缓存层。这个想法是根据查询的参数缓存某些数据库查询的结果。数据库使用默认排序规则 - SQL_Latin1_General_CP1_CI_AS 或 Lat
我有一本字典Dictionary> .外部字典和内部字典都有一个相等比较器集(在我的例子中是 StringComparer.OrdinalIgnoreCase )。字典序列化和反序列化后,两个字典的比
免责声明:也许是微 YAGNI 优化,但听我说.. 问题是实现 不区分大小写 查找表。 我的老派方式:在填充字典时,在插入之前将键大写。当有人给你一个查找键时,将键大写。 新方法(我今天了解了):字典
我是一名优秀的程序员,十分优秀!