Что-то не так происходит при использовании цикла for для добавления значений в хеш-таблицу - PullRequest
0 голосов
/ 05 января 2012

Я не совсем уверен, что именно происходит, когда я запускаю код ниже, чтобы добавить четыре значения (a, b, c, d) в мою хэш-таблицу с помощью C #.Но я знаю, что я получаю неправильный ответ.после завершения цикла я получаю 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 ]

2 голосов
/ 05 января 2012

переместите объявление CycleLink в цикл for, у вас есть ссылка на один и тот же объект в 4 местах вашей Hashtable вместо 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 голос
/ 06 января 2012

Другие ответы верны, вам нужно переместить инициализацию mycylink в ваш цикл for.

И вот почему.

Вы объявляете CycleLink. Теперь вы начинаете цикл. Вы настраиваете это. Вы добавляете его в hashmap. Все отлично.

Вы переходите к следующему элементу в цикле. Вы все еще указываете на тот же CycleLink. Вы изменяете значение CycleLink и добавляете его в hashmap. Вы делаете это в два раза больше ...

Вместо этого вы хотите создать четыре CycleLink и добавлять их каждый раз.

0 голосов
/ 05 января 2012

Обычно вы добавляете ссылку на один и тот же объект четыре раза.Каждый раз, когда вы обновляете какое-либо свойство этого объекта, это будет отражено во всех записях, которые могут иметь значение, поскольку все ссылаются на один и тот же объект.

Просто переместите следующую строку внутри for цикла:

for (i = 0; i < 4; i++)
{
    CycleLink mycylink = new CycleLink();
    // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...