我只是想知道是否可以更改哈希表的密钥?如果是这样,我该怎么做?
这是我通过这样做得到的散列表的键:
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]的样子:
答案 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的名称,和/或如何克隆参数以便保留所有位。
...或者如果你可以指出我/我们可以阅读文档的地方,那么也许有人会看看它们。对不起,我还没找到他们。