我在试图了解如何将哈希表插入 LinkedList 时遇到了一堵墙。我数不清我尝试过的不同事情。我知道我可以使用ArrayList或其他东西,但我想用LinkedLists来做这个工作,这样我就可以对它进行基准测试......
这就是我想出的:
#BEGIN SAMPLE SCRIPT
#------------------------
$list = New-Object Collections.Generic.LinkedList[Hashtable]
For($i=1; $i -lt 10; $i++){
$list.AddLast(@{ID=$i; X=100+$i;Y=100+$i})
}
ForEach($item In $list){
If($Item.x -eq 105){
$list.AddAfter($item, @{ID=128;X=128;Y=128})
Break
}
}
ForEach($item In $list){
write-host "ID:"$item.ID", X:"$item.x", Y:"$item.y", TYPE:" $item.GetType()
}
#-----------------------------------
#END SAMPLE SCRIPT
预期产出:
ID: 1 , X: 101 , Y: 101 , TYPE: System.Collections.Hashtable
ID: 2 , X: 102 , Y: 102 , TYPE: System.Collections.Hashtable
ID: 3 , X: 103 , Y: 103 , TYPE: System.Collections.Hashtable
ID: 4 , X: 104 , Y: 104 , TYPE: System.Collections.Hashtable
ID: 5 , X: 105 , Y: 105 , TYPE: System.Collections.Hashtable
ID: 128 , X: 128 , Y: 128 , TYPE: System.Collections.Hashtable
ID: 6 , X: 106 , Y: 106 , TYPE: System.Collections.Hashtable
ID: 7 , X: 107 , Y: 107 , TYPE: System.Collections.Hashtable
ID: 8 , X: 108 , Y: 108 , TYPE: System.Collections.Hashtable
ID: 9 , X: 109 , Y: 109 , TYPE: System.Collections.Hashtable
我收到的错误:
Exception calling "AddAfter" with "2" argument(s):
"The LinkedList node does not belong to current LinkedList."
触发错误消息的行:
$list.AddAfter($item, @{ID=128;X=128;Y=128})
基本上,使用 foreach
,您可以迭代值 ( hashtable
),而不是LinkedListNode
,这是AddAfter
方法的预期输入。我建议按如下方式迭代列表 -
#BEGIN SAMPLE SCRIPT
#------------------------
$list = New-Object Collections.Generic.LinkedList[Hashtable]
For($i=1; $i -lt 10; $i++){
$list.AddLast(@{ID=$i; X=100+$i;Y=100+$i})
}
$current = $list.First
while(-not ($current -eq $null))
{
If($current.Value.X -eq 105)
{
$list.AddAfter($current, @{ID=128;X=128;Y=128})
Break
}
$current = $current.Next
}
ForEach($item In $list){
write-host "ID:"$item.ID", X:"$item.x", Y:"$item.y", TYPE:" $item.GetType()
}
#-----------------------------------
#END SAMPLE SCRIPT
只是为了让头脑清醒过来,我看了一下这个。问题是错误所暗示的。 $item
是一个哈希表,而不是一个链接列表对象。为了在列表中找到正确的位置,我在$item
上执行了Find
。完成后,我得到了所需的输出。让我觉得有更好的方法来爬过列表.....
$list.AddAfter($list.Find($item), @{ID=128;X=128;Y=128})
查看对象的数据类型:
$item.GetType().FullName
System.Collections.Hashtable
($list.Find($item)).GetType().Fullname
System.Collections.Generic.LinkedListNode`1[[System.Collections.Hashtable, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
使用ForEach
时,似乎没有保留链接列表中的位置,因此需要用Find
来定位位置
对于任何不熟悉LinkedLists的人来说,我发现这是一个有用的资源。