PowerShell 中似乎有不同种类的哈希表,区分大小写的和不区分大小写的。将哈希表定义为以下 时,不区分大小写 :

$ht = @{ "Test" = "HI" }

$ht.Contains("test") #returns true, even with key name lowercase
True

$ht.ContainsKey("test") #returns true, even with key name lowercase
True

$ht.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object

但是,如果您将其定义为 则区分大小写 :
$ht_caseSensitive = New-Object System.Collections.Hashtable
$ht_caseSensitive.Add("Test", "HI")

$ht_caseSensitive.Contains("test") # returns false, since it's all lowercase
False

$ht_caseSensitive.ContainsKey("test") # returns false, same with contains key function
False

$ht_caseSensitive.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object

但是,如 GetType() 输出所示,我似乎找不到区分这些对象的方法。
  • 为什么一个区分大小写而另一个不区分?
  • 我有什么办法
    当需要知道是否重要时,可以区分它们
    我正在处理区分大小写的哈希表?
  • 最佳答案



    因为 PowerShell 经常有意将默认的 .NET 功能修改为不区分大小写,与 PowerShell 不区分大小写的整体 保持一致。

  • 因此,虽然 哈希表文字 @{ "Test" = "HI" } 确实创建了一个 [hashtable] ( System.Collections.Hashtable ) 实例,但 PowerShell 在幕后使用明确的 case-INSENSITIVE 相等比较器构造它。 [1]
  • 相比之下, 构造 [hashtable] 实例 直接尊重 .NET 的默认值,即简单地调用 .Equals() 方法进行键查找,在字符串键(典型情况)的情况下,这相当于有序、区分大小写的比较。




  • 如果您总是使用 PowerShell 哈希表文字和/或通过文字 @{} 构造(初始化)哈希表,您将始终获得不区分大小写的查找。

    如果您仍然需要反射(reflection)给定的 ​​[hashtable] 实例以确定其相等比较器是否区分大小写,您可以使用以下 - 模糊 - 技术:
    # Create a case-SENSITIVE hashtable.
    # Note: in PowerShell v5+, the more efficient alternative is:
    #       $someHashTable = [hashtable]::new()
    $someHashTable = New-Object hashtable # System.Collections.Hashtable
    
    # Use reflection to get the *non-public* (protected, in this case)
    # .EqualityComparer property value.
    $equalityComparer = [hashtable].GetProperty(
       'EqualityComparer',
       [System.Reflection.BindingFlags]'NonPublic, Instance'
     ).GetValue($someHashTable)
    
    # The hashtable is case-sensitive if it either doesn't define
    # an explicit comparer or uses one that is case-sensitive.
    $isCaseSensitive = $null -eq $equalityComparer -or
                       0 -ne $equalityComparer.Compare('a', 'A')
    

    [1] 在 Windows PowerShell(版本高达 v5.1)中,这个比较器 - 令人惊讶的是 - 文化敏感;在 PowerShell [Core] v7.0 中,它使用序数(但仍然不区分大小写)比较。请注意,在许多其他上下文中,PowerShell 使用文化不变行为 - 请参阅 this answer

    关于powershell - 在 PowerShell 中区分不同类型的哈希表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60590829/

    10-12 21:18