【问题标题】:change key of hashtable, possible?更改哈希表的键,可能吗?
【发布时间】:2015-08-20 08:38:28
【问题描述】:

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

这是我通过这样做得到的哈希表的键:

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 相同的哈希表,但我想从 handender_part_qty_multifieldITM_HANDSENDER_N002592U00U01 到 handender_part_qty_multifieldITM_HANDSENDER_N002592-00-01

这就是 selectedGroup.Parameters[i] 的样子:

【问题讨论】:

  • 您要更改键还是值?
  • 您想将值转移到新键吗?您能否提供一个具有预期结果的更有意义的样本(不是屏幕截图)。
  • 钥匙。问题是 key 得到了错误的值。如果您查看第一个,它应该是“handsender_part_qty_multifieldITM_HANDSENDER_N002592-00-01”而不是“handsender_part_qty_multifieldITM_HANDSENDER_N00259U00U01”
  • "key 得到了错误的值" 这是什么意思?你的问题不清楚。
  • 我的意思很明显,因为钥匙错了。这意味着代码中没有任何作用,因为它找不到正确的密钥。它正在寻找密钥 handsender_part_qty_multifieldITM_HANDSENDER_N002592-00-01 但密钥是 handsender_part_qty_multifieldITM_HANDSENDER_N002592U00U01 所以它找不到它,因此系统无法工作

标签: c# hashtable


【解决方案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 开发人员不会放弃使用它,请尝试一些典型的事情:

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,您必须检查是否/如何编辑参数的名称,和/或如何克隆参数以保留所有位。

...或者如果你能指出我/我们可以在哪里阅读文档,那么也许有人会看它们。没找到,抱歉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2010-10-19
    • 2011-09-01
    相关资源
    最近更新 更多