2015-08-20 2 views
0

Мне просто интересно, можно ли изменить ключ хэш-таблицы? И если да, то как мне это сделать?ключ изменения хеш-таблицы, возможно?

enter image description here

Вот ключи от моего Hashtable, который я получил, делая это:

var param = selectedGroup.Parameters.Keys; 

так, что я хочу сделать, это в основном просто изменить ключ.

selectedGroup.Parameters.Keys[i].Value = newKey; 

как это сделать?

Я думаю, мне нужно каким-то образом переместить все значения, приписывающие этот ключ.

я попытался сделать новый Hashtable как этот

var parameters = new Tacton.Configurator.ObjectModel.SequencedHashtable<Tacton.Configurator.ObjectModel.Parameter>(); 
       for (int i = 1; i < selectedGroup.Parameters.Count + 1; i++) 
       { 
        var para = result.Xml.SelectNodes("/session/view/parameters/param[" + i + "]/field")[0].InnerText + result.Xml.SelectNodes("/session/view/parameters/param[" + i + "]/desc-frags/frag[2]/@name")[0].Value; 
        var param = selectedGroup.Parameters[i]; 
        parameters.Add(para, param); 
       } 

но тогда я получил следующую ошибку:

Unable to cast object of type 'Named`1[Tacton.Configurator.ObjectModel.Parameter,Tacton.Configurator.ObjectModel.Parameter]' to type 'Tacton.Configurator.ObjectModel.Parameter'. 

я в основном хочу такой же, как Хеш selectedGroup.Parameters, но я хочу, чтобы изменить ключи от handsender_part_qty_multifieldITM_HANDSENDER_N002592U00U01 к handsender_part_qty_multifieldITM_HANDSENDER_N002592-00-01

это то, что selectedGroup.Parameters [я] выглядит следующим образом:

enter image description here

+2

Вы хотите изменить ключ или значение? –

+0

Вы хотите перенести значения на новый ключ? Можете ли вы предоставить более мнимый образец с ожидаемым результатом (а не как снимок экрана). –

+0

ключ. Проблема в том, что ключ получает неправильное значение. Если вы посмотрите на первый, это должно быть «handsender_part_qty_multifieldITM_HANDSENDER_N002592-00-01» вместо «handsender_part_qty_multifieldITM_HANDSENDER_N00259U00U01» –

ответ

1

В большинстве версий «хэш-таблиц», нет никакого способа изменения ключа записи. Это связано с тем, что хэш-значение ключа очень важно. Изменение ключа почти всегда меняет хэш-значение, и записи нужно перемещать одинаково, как если бы вы удалили старую запись и снова добавили новую запись с новым ключом.

Вот почему, как правило, нет способа «редактирования» ключа. Вместо этого типичные хэш-таблицы заставляют вас явно удалять, а затем добавлять запись обратно. Посмотрите на классический словарь .Net на примере этого.

Теперь, что касается вашего фрагмента кода, это чистое догадки. Я не мог найти ничего связанного с Tacton/SequencedHashtable в Интернете, поэтому я не мог пересмотреть его API, поэтому, с моей точки зрения, внутри могут быть пушистые драконы, а yourhash.Add(foo) может отформатировать ваш жесткий диск просто для удовольствия.

Однако, основываясь на вашем требовании:

i basically want the same hashtable as selectedGroup.Parameters but i want to change the keys from handsender_part_qty_multifieldITM_HANDSENDER_N002592U00U01 to handsender_part_qty_multifieldITM_HANDSENDER_N002592-00-01

и на «общей идее Хеш» и при условии, что это Хеш имеет некоторый разумный API, который разработан так, типичный .Net разработчик Wouldn» т грызть руки от его использования, пожалуйста, попробуйте некоторые типичные вещи:

var parameters = new SequencedHashtable<Parameter>(); 
foreach(var par in selectedGroup.Parameters) 
{ 
    var newname = par.Name.Replace("U", "-"); 

    // try changing the parameter's name: 
    par.Name = newname; 
    parameters.Add(par); 
} 

или

... 
    // try adding the parameter under new name: 
    par.Name = newname; 
    parameters.Add(newname, par); 
... 

или

... 
    // try cloning the parameter with new name: 
    var newpar = new Parameter(newname, par.config1, par.option2, par.foobar3, ...) 
    parameters.Add(newpar); 
... 

Это всего лишь эскиз. Возможно, вам придется найти правильную перегрузку метода «Добавить».Возможно, вам нужно будет использовать «Вставить». Может оказаться, что хеш-таблица не поддерживает добавление, а затем проверит ее конструкторы. Может быть, есть какой-то конструктор, который принимает список параметров?

var parameters = new List<Parameter>(); <---- INTO a temporary list 
foreach(var par in selectedGroup.Parameters) 
{ 
    var newpar = ..par or clone of par.. 
    ....edits, fixes to the newpar 
    parameters.Add(newpar); 
} 

var myNewParams = new SequencedHashtable<Parameter>(parameters); 

и т.д. Unfortunatelly, большую часть работы на вашей стороне - вы должны рассмотреть API Hte в hashTable, вы должны проверить, если/как изменить имя Param, и/или как клонировать параметр так что все биты сохранены.

... или если бы вы могли указать, где я/Мы можем прочитать документы, тогда, возможно, кто-то будет смотреть на них. Я их не нашел, извините.

Смежные вопросы