【问题标题】:How to add Duplicate Entries to Hashtable in C# [closed]如何在 C# 中将重复条目添加到哈希表 [关闭]
【发布时间】:2013-02-14 14:26:43
【问题描述】:

我有一个 xml ......有一些重复的条目,如何在 Hashtable 中添加这些条目

        <hashdata>
        <data key="A" value="A1"/>
        <data key="B" value="B1"/>
        <data key="C" value="C1"/>
        <data key="D" value="D1"/>
        <data key="E" value="E1"/>
        <data key="F" value="F1"/>
        <data key="A" value="A2"/>
        <data key="D" value="D2"/>
        <data key="F" value="F2"/>
        </hashdata>


        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load(@"test.xml");
        XmlNodeList xnode = xmldoc.SelectNodes("/hashdata/data");
        Hashtable hst = new Hashtable();
        for (int iCount = 0; iCount < xnode.Count; iCount++)
        {
            hst[xnode[iCount].Attributes["key"].Value.ToString()] = xnode[iCount].Attributes["value"].Value.ToString();
        }

如何解决这个问题

【问题讨论】:

  • 您将值存储为集合。
  • 欢迎来到 Stackoverflow,请阅读 faqHow to Ask
  • @user2046631:请不要在 cmets 中添加代码。改为编辑您的问题。请阅读tinyurl.com/so-list
  • 但它会覆盖值

标签: c# hashtable


【解决方案1】:

这是设计使然 - Hashtable 中的每个键都是唯一的,当使用索引运算符 [] 时,将值分配给已存在的键将覆盖该值。

我建议进行一些更改:

首先,尽可能避免使用Hashtable,而是使用其中一个通用集合,例如Dictionary&lt;,&gt;.

如果您确实需要每个键有多个值,您可能可以使用以下几行:

var dict = new Dictionary<string, List<string>>();
foreach (XmlNode node in xnode)
{
    var key = node.Attributes["key"].Value;
    List<string> values;
    if (!dict.TryGetValue(key, out values))
    {
        values = new List<string>();
        dict.Add(key, values);
    }
    values.Add(node.Attributes["value"].Value);
}

或者要使用 Linq 来构造字典,你可以使用类似的东西:

var dict = xnode.Cast<XmlNode>()
                .GroupBy(n => n.Attributes["key"].Value, n => n.Attributes["value"].Value)
                .ToDictionary(g => g.Key, g => g.ToList());

如果你绝对必须使用Hashtable,那么上面的内容可以修改如下:

var hash = new Hashtable();
foreach (XmlNode node in xnode)
{
    var key = node.Attributes["key"].Value;
    var values = (List<string>)hash[key];
    if (values == null)
    {
        values = new List<string>();
        hash.Add(key, values);
    }
    values.Add(node.Attributes["value"].Value);
}

【讨论】:

  • 但我的任务只是在 Hashtable 中完成..无论如何
  • @user2046631 我已经用 Hashtable 版本更新了我的答案,但如前所述,除非有正当理由使用非泛型集合,否则泛型版本要干净得多(@987654329 没有强制转换@、TryGetValue 等的使用)
【解决方案2】:

你不能,Hashtable Key 是唯一的。 msdn

尝试列表等

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2021-10-21
    • 2014-01-10
    • 2023-04-05
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多