2017-01-22 27 views
0

我想做广度优先搜索算法作为迷宫求解器。迷宫是由一个TableLayoutPanel构成的。如何以不同的方式命名Hashtable中的按键

我有这样的事情:

Hashtable hash = new Hashtable(); 
    Queue<TableLayoutPanelCellPosition> q_cellposition = new Queue<TableLayoutPanelCellPosition>(); 
    while (q_cellposition.Count != 0) 
     { 
      TableLayoutPanelCellPosition currentPosition = q_cellposition.Dequeue(); 
      TableLayoutPanelCellPosition left = new TableLayoutPanelCellPosition(currentPosition.Column - 1, currentPosition.Row); 
      Label leftN = (Label)tlp.GetControlFromPosition(left.Column, left.Row); 
      TableLayoutPanelCellPosition right = new TableLayoutPanelCellPosition(currentPosition.Column + 1, currentPosition.Row); 
      Label rightN = (Label)tlp.GetControlFromPosition(right.Column, right.Row); 

      hash.Add(leftN, currentPosition); 
      q_cellposition.Enqueue(left); 

      hash.Add(rightN, currentPosition); 
      q_cellposition.Enqueue(right); 
     } 

现在,在第一次迭代之后,它显然试图将新KeyValuePair添加到哈希表。然而,它将新的leftN键和rightN键看作相同的标签(尽管它们在技术上不是这样),并且它引发了错误,即该键已被添加。我想我每次向Hashtable添加内容时都必须更改密钥的名称。我现在的问题是:我如何有效地做到这一点?

回答

0

I believe that some consider the Hashtable obsolete或劣于通用Dictionary对象,你应该使用它。

I think you might be able to use the array operator访问并替换已在DictionaryHashtable中的密钥,但不会引发该密钥已存在的异常。

Add更多用于当您知道密钥尚未在Hashtable中时。除非你需要为每个项目创建的唯一密钥,即使它们共享相同的密钥

hash.Add(leftN, currentPosition); 

hash[leftN] = currentPosition; 

所以Add语句会改变而来。在这一点上,尽管您可能会切换到一个密钥生成方法,通过在密钥生成期间添加另一个变量来使这些相同的密钥不同,或者您需要切换到另一个更合适的数据结构。

如果你的钥匙总是敲击,你可能会说左右分隔成两个不同的哈希表,但我怀疑这是你想要的。或者您可以将当前迭代的前缀添加到键的前面。但是在那个时候,你可能会使用通用的Stack object

相关问题