我在哈希表中有重复的键
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()
“
这两个方案对我帮助很大,谢谢!
我知道这是不可能的,但我做到了。从 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()
“
这两个方案对我帮助很大,谢谢!