2012-11-13 44 views
3

“它的工作原理 - 但它是一种最佳实践吗?”题。在Perl中,有一种紧凑的方式来跟踪文件中发现的字符串的出现:将它们存储在散列表中。例如:为做到这一点Powershell:通过哈希表计算唯一字符串

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


Perl的增量关键the string in question许多倍。它确保在跟踪事件发生的同时保持独特的“命中”。只是黑客的时候,我发现我可以做许多相同的使用PowerShell:

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


好了,所以它的工作原理。但是在Powershell中有没有一种方法被认为是更好的做法?

+0

哦,很高兴。我没有想到这可以奏效。 – Joey

回答

5

您的方法看起来相当不错,至少对于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 

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

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

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

输出:

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

很好的答案 - 谢谢。我一直在阅读的新手书籍尚未涵盖散列表中的区分大小写,这对了解这一点非常有用。 (当我想到'最佳'的做法时,我在想:清楚地了解乍一看,与语言(IOW,不是一些可怕的黑客)一致,以及_maintainable_。) – marst12017