2013-02-14 52 views
-2

我有一个xml ......还有在一些重复的条目如何添加那些在Hashtable中如何添加重复的条目在C#中哈希表

 <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(); 
     } 

如何解决这个

+7

将值存储为集合。 – leppie 2013-02-14 14:27:51

+2

欢迎来到Stackoverflow,请阅读[常见问题]和[问] – 2013-02-14 14:28:50

+2

@ user2046631:请不要在评论中添加代码。改为编辑你的问题。请阅读http://tinyurl.com/so-list – 2013-02-14 14:30:23

回答

0

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

尝试列表等

3

这是由设计 - 在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); 
} 
+0

但我的任务是在Hashtable中做的..只是以任何方式 – 2013-02-14 14:53:29

+0

@ user2046631我用Hashtable版本更新了我的答案,但如所示,除非有一个合法的理由来使用非泛型集合,否则泛型版本会更清晰(不会从'object'投射,使用'TryGetValue'等) – Iridium 2013-02-14 15:09:22