如何调试HashSet循环中Contains方法无法识别已知存在于键字段中的字符串问题?
调试HashSet.Contains无法识别字符串的问题
这种情况我之前碰到过好几次,大概率是字符串的隐形差异或者初始化环节的小问题,给你几个针对性的调试方向:
先排查字符串的表面&隐形差异
很多时候看起来一样的字符串,实际藏着空格、换行或者大小写区别:- 拿一个你认为应该存在但找不到的哈希值,用
Write-Host "[$_]"打印,方括号能帮你看清首尾有没有空格或者换行符; - 对比本地和远程哈希的字符串长度:
$localmd5[0].Lengthvs$remotefilehash[0].Length,长度不一样肯定有问题; - 试试不区分大小写的HashSet初始化,验证是不是大小写导致的:
$localHashSet = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) $localmd5 | ForEach-Object { $localHashSet.Add($_) | Out-Null }
- 拿一个你认为应该存在但找不到的哈希值,用
验证HashSet的初始化是否正确
确认你的HashSet真的包含了你以为的元素:- 检查
$localmd5的元素类型:$localmd5 | ForEach-Object { $_.GetType().Name },确保都是String类型,避免类型转换导致的匹配失败; - 打印
$localHashSet.Count,看看数量和$localmd5.Count是否一致,排除初始化时元素丢失的情况; - 手动添加一个测试哈希值到HashSet,再用Contains测试,比如:
$testHash = "你确定存在的某个哈希值" $localHashSet.Add($testHash) | Out-Null $localHashSet.Contains($testHash) # 应该返回True,验证方法本身没问题
- 检查
直接对比单个元素的匹配情况
挑一个有问题的远程哈希值,做针对性测试:$target = $remotefilehash | Where-Object { # 选一个你认为应该匹配的元素 } # 直接测试Contains $localHashSet.Contains($target) # 试试Trim掉首尾空白后再测试 $localHashSet.Contains($target.Trim()) # 用PowerShell的-eq对比,看看和.NET的Contains结果是否一致 $localmd5 -contains $target如果Trim后能匹配,说明是首尾空白的问题;如果-eq能匹配但Contains不行,那就是比较器的差异。
排查不可见控制字符
极端情况下,字符串可能包含不可见的控制字符(比如\r、\t),可以把字符转成ASCII码对比:# 本地哈希的字符编码 $localHash = $localmd5 | Where-Object { $_ -like "*目标哈希的部分内容*" } $localHash.ToCharArray() | ForEach-Object { [int]$_ } # 远程哈希的字符编码 $target.ToCharArray() | ForEach-Object { [int]$_ }对比两组数字,就能找到不一样的字符。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

