如何检查PowerShell中各类IDictionary是否区分大小写?
如何检查PowerShell中各类字典是否区分大小写?
给定实现[System.Collections.IDictionary]的字典对象,可通过以下方式分别或通用判断其是否区分大小写:
分类型判断
哈希表([Hashtable])
直接读取CaseSensitive属性即可:
# 默认哈希表不区分大小写 $defaultHt = @{} $defaultHt.CaseSensitive # 返回 False # 创建区分大小写的哈希表 $caseSensitiveHt = [Hashtable]::new($true) $caseSensitiveHt.CaseSensitive # 返回 True
泛型字典([System.Collections.Generic.Dictionary[string, object]])
通过Comparer属性的Equals方法对比大小写不同的字符串:
# 默认泛型字典(依赖系统默认字符串比较器) $defaultDict = [System.Collections.Generic.Dictionary[string, object]]::new() $defaultDict.Comparer.Equals('A', 'a') # 返回 True 表示不区分大小写 # 创建区分大小写的泛型字典 $caseSensitiveDict = [System.Collections.Generic.Dictionary[string, object]]::new([StringComparer]::Ordinal) $caseSensitiveDict.Comparer.Equals('A', 'a') # 返回 False 表示区分大小写
有序字典([Ordered])
PowerShell的有序字典本质是[System.Collections.Specialized.OrderedDictionary],可通过两种方式判断:
- 尝试添加大小写不同的键,观察是否报错:
$ordered = [ordered]@{A = 1} try { $ordered.Add('a', 2) Write-Host "区分大小写" } catch { Write-Host "不区分大小写" }
- 通过反射获取内部比较器:
$ordered = [ordered]@{A = 1} $comparer = $ordered.GetType().GetField("_comparer", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance).GetValue($ordered) $comparer.Equals('A', 'a') # 返回 True 则不区分,False 则区分
通用判断方法
对于所有实现[IDictionary]的类型,可通过尝试添加大小写键的通用逻辑判断,且不会修改原字典:
function Test-DictionaryCaseSensitive { param([System.Collections.IDictionary]$Dictionary) # 创建测试用的字典副本,避免修改原数据 $testDict = if ($Dictionary -is [System.Collections.Generic.IDictionary[object, object]]) { [System.Collections.Generic.Dictionary[object, object]]::new($Dictionary.Comparer) } else { $testDict = $Dictionary.GetType().GetConstructor(@()).Invoke(@()) foreach ($key in $Dictionary.Keys) { $testDict[$key] = $Dictionary[$key] } } $keyUpper = 'TestKey' $keyLower = 'testkey' $testDict[$keyUpper] = $null try { $testDict.Add($keyLower, $null) return $true # 成功添加,说明区分大小写 } catch { return $false # 添加失败,说明不区分大小写 } } # 调用示例 Test-DictionaryCaseSensitive ([ordered]@{}) # 返回 False(不区分) Test-DictionaryCaseSensitive ([Hashtable]::new($true)) # 返回 True(区分)
内容的提问来源于stack exchange,提问作者iRon
相关产品推荐
相关产品推荐

