我在哈希表中有重复的键

I have duplicate keys in a hashtable

我知道这是不可能的,但我做到了。从 SQL 查询中,我提取了 1、2 或 3 个链接到设备的电子邮件地址。我将它们放入哈希表 table。从那里,我循环遍历,根据第二个哈希 table 检查它,该哈希 table 由第一个 table 中的值组成。如果有一个电子邮件地址,则此方法有效,但如果有多个,则找不到匹配项,而是创建一个新密钥。

$DeviceList = @{
    "Device1" = "Sally.Johnson@Domain.com";
    "Device7" = "Sally.Johnson@Domain.com";
    "Device8" = "Sally.Johnson@Domain.com";
    "Device2" = "Bob.Davis@domain.com", "Jane.Doe@domain.com";
    "Device3" = "Bob.Davis@domain.com", "Jane.Doe@domain.com";
    "Device4" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com";
    "Device5" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com";
    "Device6" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"
}
$CompletedDevices = @{}

foreach ($Device in $DeviceList.GetEnumerator()) {
    $Devicename = ($Device.Key).ToLower()
    $OwnerEmail = ($Device.Value).ToLower()

    if ($CompletedDevices.ContainsKey($OwnerEmail)) {
        $CompletedDevices.$OwnerEmail += "$Devicename"
    } else {
        $CompletedDevices += @{$OwnerEmail = " ", $Devicename}
    }
}

$CompletedDevices

在脚本 运行s 之后,如果我只是 运行 $CompletedDevices += @{$owneremail = " ", $Devicename},它确实会给我一个错误

Item has already been added

但它没有在 ContainsKey() 检查中找到它,而是将其添加为第二个三分之一或第五十个重复键。

这是此示例的最终结果:

上面的例子重现了这个问题。我真的希望我只是忽略了一些非常简单的事情。

MathiasR.Jessen把答案放在评论里:

“您不会生成重复的键 - 您正在循环内复制值数组,哈希表将接受生成的对象作为键,而不是按值,而是按身份。

$CompletedDevices.GetEnumerator()|%{"$($_.Key): $($_.Key.GetHashCode())" }

$OwnerEmail = ($Device.Value).ToLower()更改为$OwnerEmail = "$($Device.Value)".ToLower()

这两个方案对我帮助很大,谢谢!