在哈希表数组中查找重复项

时间:2019-10-09 13:17:41

标签: powershell

我有一个哈希表数组,我需要确定是否有元素具有相同的Name

我有这个HasDuplicate函数,如果数组包含重复项,则返回TrueFalse

我在这里所做的是,我遍历每个元素,并将其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
}

3 个答案:

答案 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