我有一个哈希表数组,我需要确定是否有元素具有相同的Name
。
我有这个HasDuplicate
函数,如果数组包含重复项,则返回True
或False
。
我在这里所做的是,我遍历每个元素,并将其Name
添加到另一个数组,然后检查它是否为exists
。但是这段代码看起来并不好,我在想是否还有另一种方法可以实现这一目标
# object looks like this
$array = @(
@{ Name = 'First', Passed = $True }
@{ Name = 'First', Passed = $False }
)
Function HasDuplicate
{
param($array)
$all = @()
foreach($item in $array)
{
$item_name = $item.Name
if($all -contains $item_name)
{
Write-Error "Duplicate name ""$item_name"""
return $True
}
else
{
$all += $item_name
}
}
return $False
}
答案 0 :(得分:8)
Group-Object可能很简单,就像这样:
$array = @(
@{ Name = 'First'; Passed = $True }
@{ Name = 'First'; Passed = $False }
)
$array.Name | Group-Object | Where-Object Count -GT 1
答案 1 :(得分:0)
使用哈希表的另一种方法:
$array = @(
@{ Name = 'First'; Passed = $True }
@{ Name = 'First'; Passed = $False }
)
$h = @{}
$array | % {$h[$_.Name] += 1 }
$h.GetEnumerator() | Where value -GT 1
答案 2 :(得分:0)
与其他答案相比,这看起来可能不太好看,但是您可以在另一个哈希表中计算您的名字,然后输出重复项。
$array = @(
@{ Name = 'First'; Passed = $True }
@{ Name = 'First'; Passed = $False }
);
# Count names in array
$counts = @{}
foreach ($object in $array) {
$name = $object.Name
if (-not $counts.ContainsKey($name)) {
$counts[$name] = 0
}
$counts[$name] += 1
}
# Output duplicates
foreach ($name in $counts.Keys) {
if ($counts[$name] -gt 1) {
Write-Output ("Duplicate Name: " + $name)
}
}
输出:
Duplicate Name: First