改变哈希表的关键,可能吗?

时间:2015-08-20 08:38:28

标签: c# hashtable

我只是想知道是否可以更改哈希表的密钥?如果是这样,我该怎么做?

enter image description here

这是我通过这样做得到的散列表的键:

var param = selectedGroup.Parameters.Keys;

所以我想做的事情基本上只是改变关键。

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

我该怎么做?

我想我必须以某种方式将所有值归结为该键。

我试图像这样制作一个新的哈希表

    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 [i]的样子:

enter image description here

1 个答案:

答案 0 :(得分:1)

在大多数版本的“哈希表”中,无法更改条目的键。这是因为密钥的哈希值非常重要。更改密钥几乎总是更改哈希值,并且必须相同地移动条目,就像删除旧条目并使用新密钥重新添加新条目一样。

这就是为什么通常无法“编辑”密钥的原因。相反,典型的哈希表会强制您删除然后再添加条目。看看经典的.Net字典就是一个例子。

现在,至于你的代码,这是一个纯粹的猜测。我在互联网上找不到与Tacton / SequencedHashtable相关的任何内容,所以我无法查看它的API,所以从我的观点来看,里面可能有毛茸茸的龙,yourhash.Add(foo)可能只是为了好玩而格式化你的硬盘

但是,根据您的要求:

  

我基本上想要与selectedGroup.Parameters相同的哈希表,但我想将密钥从handsender_part_qty_multifieldITM_HANDSENDER_N002592U00U01更改为handsender_part_qty_multifieldITM_HANDSENDER_N002592-00-01

以及“哈希表的一般概念”,并假设这个哈希表有一些合理的API,这是一个典型的.Net开发人员不会咬他的手,请尝试一些典型的东西:< / p>

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 );

等。不幸的是,大部分工作都在你身边 - 你必须检查hte hashtable的API,你必须检查是否/如何编辑param的名称,和/或如何克隆参数以便保留所有位。

...或者如果你可以指出我/我们可以阅读文档的地方,那么也许有人会看看它们。对不起,我还没找到他们。