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/