Powershell:通过哈希表计算唯一字符串

mar*_*017 4 powershell hashtable unique

"它有效 - 但它是最好的做法吗?" 题.在Perl中,有一种紧凑的方式来跟踪文件中发现的字符串的出现:将它们存储在哈希表中.例如:

$HashTable{'the string in question'}++;
Run Code Online (Sandbox Code Playgroud)


Perl会在the string in question完成此操作后多次递增key的值.它可以在跟踪事件发生的同时确保独特的"命中".只是乱搞,我发现我可以用Powershell做同样的事情:

$HashTable['a']++甚至
$Hashtable.a++(哪种让我感到惊讶 - 甚至)
$Hashtable."this is a key"++


好的,所以它有效.但是,Powershell中有一种方法被认为是更好的做法吗?

Rom*_*min 6

您的方法看起来非常好,至少对于PowerShell及其哈希表的帮助程序.请记住,定义的哈希表@{}不区分大小写.如果您需要区分大小写的哈希表,则创建它New-Object System.Collections.Hashtable.

例:

# case insensitive
$hash = @{}
$hash['a']++
$hash['A']++
$hash

'------------------------'

# case sensitive
$hash = New-Object System.Collections.Hashtable
$hash['a']++
$hash['A']++
$hash
Run Code Online (Sandbox Code Playgroud)

输出:

Name                           Value
----                           -----
a                              2
------------------------
a                              1
A                              1
Run Code Online (Sandbox Code Playgroud)

在C#中使用Dictionary<string, int>可能是一种"更好的做法".它也可能在PowerShell中,但它不太可能使PowerShell中的"更好".

PowerShell-ish解决方案可能正在使用Group-Object -NoElement.这是一种更好的方法还是实践?我不知道.这取决于一些因素,包括偏好.这是一个例子:

'a', 'A', 'foo', 'foo' , 'bar' | Group-Object -NoElement
Run Code Online (Sandbox Code Playgroud)

输出:

Count Name
----- ----
    2 a
    2 foo
    1 bar
Run Code Online (Sandbox Code Playgroud)