-3

私はxmlを持っています...ハッシュテーブルにそれらを追加する方法にいくつかの重複したエントリがあります

        <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まず、可能であればまとめて使用することを避け、代わりにジェネリック コレクションの 1 つを使用します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 に答える