You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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],可通过两种方式判断:

  1. 尝试添加大小写不同的键,观察是否报错:
$ordered = [ordered]@{A = 1}
try {
    $ordered.Add('a', 2)
    Write-Host "区分大小写"
} catch {
    Write-Host "不区分大小写"
}
  1. 通过反射获取内部比较器:
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:12:32