我有一个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();
}
如何解决这个问题
答案 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
尝试列表等。