使用for循环将值添加到哈希表中时发生了错误

时间:2012-01-05 19:56:07

标签: c#-4.0

我不太确定当我运行下面的代码时使用C#将四个值(a,b,c,d)添加到我的哈希表中时到底发生了什么。但我确实知道答案错了。循环完成后,我的哈希表中存储了4个ds。请帮助我!

Hashtable cirlTmp = new Hashtable();

CycleLink mycylink = new CycleLink();
int i = 0;
for (i = 0; i < 4; i++)
{
      mycylink.link_id = i;
      mycylink.begine_state = i;//
      mycylink.end_state = 1 + i;
      mycylink.proscDescrp = (process_descrp)i;
      lock (cirlTmp.SyncRoot)
      {
           cirlTmp.Add(i, mycylink);
      }   
 }

我在cirlTemp中得到的是

  [3]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
  [2]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
  [1]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
  [0]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;

.......任何提示都会有所帮助!感谢

3 个答案:

答案 0 :(得分:2)

在for循环中移动你的CycleLink声明,你只需要在Hashtable中的4个位置引用同一个对象而不是4个不同的对象

并且您的对象的值只是您在循环的最后一次运行中设置的值,即 i 3

Hashtable cirlTmp = new Hashtable();

int i = 0;
for (i = 0; i < 4; i++)
{
  CycleLink mycylink = new CycleLink();
  mycylink.link_id = i;
  mycylink.begine_state = i;//
  mycylink.end_state = 1 + i;
  mycylink.proscDescrp = (process_descrp)i;
  lock (cirlTmp.SyncRoot)
  {
    cirlTmp.Add(i, mycylink);
  }   
}

答案 1 :(得分:1)

其他答案都是正确的,您需要在mycylink循环内移动for的初始化。

这就是原因。

您宣布CycleLink。你现在开始循环。你配置它。您将其添加到hashmap。一切都好。

你转到循环中的下一个元素。您仍然将指向同一CycleLink 。您修改CycleLink的值并将其添加到hashmap。你再做两次......

相反,你想要创建四个CycleLink并每次添加它们。

答案 2 :(得分:0)

基本上,您将对同一对象的引用添加四次。每次更新此对象的任何属性时,这都将反映在所有hastable条目中,因为它们都引用了同一个对象。

只需在for循环中移动以下行:

for (i = 0; i < 4; i++)
{
    CycleLink mycylink = new CycleLink();
    // ...