如何在C#中向Hashtable添加重复项

时间:2013-02-14 14:26:43

标签: c# hashtable

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

如何解决这个问题

2 个答案:

答案 0 :(得分:4)

这是设计使用 - 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);
}

答案 1 :(得分:0)

你不能,Hashtable Key是独一无二的。 msdn

尝试列表等。