【问题标题】:"The LinkedList node does not belong to current LinkedList"“LinkedList 节点不属于当前 LinkedList”
【发布时间】:2015-01-24 05:31:40
【问题描述】:

我在尝试了解如何将哈希表插入 LinkedLists 时遇到了困难。我忘记了我尝试过的不同的东西。我知道我可以使用 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}) 

【问题讨论】:

    标签: powershell collections linked-list hashtable


    【解决方案1】:

    只是为了让头脑运转起来,我看了一下这个。问题是错误所暗示的。 $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 时似乎没有保留LinkedList 中的位置,因此需要使用Find 定位位置

    对于不熟悉 LinkedLists 的人,我发现 this 是一个有用的资源。

    【讨论】:

      【解决方案2】:

      基本上,使用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
      

      【讨论】:

      • 遍历列表的完美方式。
      • 感谢您的解释;难怪声明和强制转换都没有帮助 - 我处理了错误的对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      相关资源
      最近更新 更多