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

时间:2012-11-13 08:32:13

标签: powershell hashtable unique

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

$HashTable{'the string in question'}++;


Perl将密钥the string in question的值递增多次。它可以在跟踪事件发生的同时确保独特的“命中”。只是乱搞,我发现我可以用Powershell做同样的事情:

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

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

1 个答案:

答案 0 :(得分: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

输出:

Name                           Value
----                           -----
a                              2
------------------------
a                              1
A                              1

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

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

'a', 'A', 'foo', 'foo' , 'bar' | Group-Object -NoElement

输出:

Count Name
----- ----
    2 a
    2 foo
    1 bar