2013-02-14 36 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