-3

我有一个 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();
        }

如何解决这个问题

4

2 回答 2

4

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

我建议进行一些更改:

首先,Hashtable尽可能避免完全使用,而是使用其中一个通用集合,例如Dictionary<,>.

如果实际上每个键确实需要多个值,则可以使用以下几行:

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);
}
于 2013-02-14T14:40:19.263 回答
-1

你不能,Hashtable Key 是唯一的。 微软

尝试列表等。

于 2013-02-14T14:38:57.650 回答