Bir*_*man 4 powershell hashtable
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
Run Code Online (Sandbox Code Playgroud)
但是,如果您这样定义它,则区分大小写:
$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
Run Code Online (Sandbox Code Playgroud)
但是,如GetType()输出所示,我似乎无法找到区分这些对象的方法。
为什么一个区分大小写而另一个不区分?
因为PowerShell 经常有意将默认的 .NET 功能修改为不区分大小写,与 PowerShell整体不区分大小写保持一致。
因此,虽然哈希表文字 @{ "Test" = "HI" }确实创建了一个[hashtable]( System.Collections.Hashtable) 实例,但PowerShell在幕后使用显式大小写不敏感的相等比较器来构造它。[1]
与此相反,构造一个[hashtable]实例直接荣誉.NET的默认值,这是为了简单地调用.Equals()方法为键查找,这在的情况下,字符串键(典型的情况下)达到序,区分大小写的比较。
当知道我是否正在处理区分大小写的哈希表很重要时,有什么方法可以区分它们吗?
如果您总是使用 PowerShell 哈希表文字和/或通过文字构造(初始化)哈希表@{},您将始终获得不区分大小写的查找。
如果您仍然需要反思给定的[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')
Run Code Online (Sandbox Code Playgroud)
[1] 在Windows PowerShell(版本高达 v5.1)中,这个比较器 - 令人惊讶的是 -文化敏感;在 PowerShell [Core] v7.0 中,它使用序数(但仍然不区分大小写)比较。请注意,在许多其他上下文中,PowerShell 使用文化不变行为 - 请参阅此答案。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |