1

私はC#4.0を使用しています。IDictionary を使用して (string,string) ペアを格納したい。以下のように:

Dictionary<string, string> _tempDicData = new Dictionary<string, string>();
      _tempDicData.Add("Hello", "xyz");
      _tempDicData.Add("Hello", "aaa");
      _tempDicData.Add("Hello", "qwert");
      _tempDicData.Add("Hello", "foo");
      _tempDicData.Add("Hello", "pqr");
      _tempDicData.Add("Hello", "abc");

しかし、エラーが発生しました:

An item with the same key has already been added.

では、どうすれば同じキーを IDictionary に保存できますか?

4

11 に答える 11

5

IDictionary<K,T>同じ項目を複数回追加することはできません。これが、連想コンテナーであるディクショナリーの要点です。ただし、次のように既存のものを置き換えることができます。

_tempDicData.Add("Hello", "xyz");
_tempDicData["Hello"] = "aaa";

キーごとに複数のアイテムが必要な場合は、リストの辞書を作成できます。

IDictionary<string,IList<string>> _tempDicData =
    new Dictionary<string,IList<string>>();
IList<string> lst = new List<string>();
lst.Add("xyz");
lst.Add("aaa");
_tempDicData.Add("Hello", lst);

キーのリストが存在するかどうかわからない場合は、次のパターンを使用して新しいアイテムを追加できます。

IList<string> lst;
if (!_tempDicData.TryGetValue("Hello", out lst)) {
    _tempDicData.Add("Hello", lst);
}
lst.Add("xyz");
lst.Add("aaa");
于 2012-07-17T10:33:57.723 に答える
3

ディクショナリに同じキーを持つ 2 つの項目を含めることはできません。ただし、それ自体がコレクションである 1 つのアイテムを持つことができます。

Dictionary<string, List<string>> _tempDicData = new Dictionary<string, List<string>>
{
    { "Hello", new List<string> { "xyz", "aa", "foo" },
};

この方法を使用する場合、基になるリストが既に作成されている場合と作成されていない場合があるため、アイテムにアクセスするときに注意する必要があります。

// WRONG: _tempDicData["Hello"] might not exist!
_tempDicData["Hello"].Add("bar");

// CORRECT:
if (!_tempDicData.ContainsKey("Hello")) {
    _tempDicData["Hello"] = new List<string>();
}
_tempDicData["Hello"].Add("bar");
于 2012-07-17T10:36:25.877 に答える
2

を作成しますDictionary<string,List<string>>

Dictionary<string,List<string>> dict=new Dictionary<string,List<string>>();
dict.Add("hello",new List<string>());
dict["hello"].Add("foo");
dict["hello"].Add("bar");
于 2012-07-17T10:34:56.310 に答える
2

重複したキーを追加できるクラスは次のようになります。

class TDictionary<K, V>
{
    struct KeyValuePair
    {
        public K Key;
        public V Value;
    }

    private readonly List<KeyValuePair> fList = new List<KeyValuePair>();

    public void Add(K key, V value)
    {
        fList.Add(new KeyValuePair { Key = key, Value = value });
    }

    public List<V> this[K key]
    {
        get { return (from pair in fList where pair.Key.Equals(key) select pair.Value).ToList(); }
    }

    public List<K> Keys
    {
        get { return fList.Select(pair => pair.Key).ToList(); }
    }

    public List<V> Values
    {
        get { return fList.Select(pair => pair.Value).ToList(); }
    }
}
于 2012-07-17T10:58:20.680 に答える
2

それはいけません。ディクショナリは、キーごとに 1 つの項目しか保持できません。ディクショナリは、おそらく探しているデータ構造ではありません。

于 2012-07-17T10:33:41.593 に答える
2

IDictionary ではできません。NameValueCollection を使用してみてください。

于 2012-07-17T10:36:28.543 に答える
1

できません?

Dictionary<string, List<string>>または、読み取り専用のソリューションが必要な場合は、ToLookup拡張メソッドを使用できます。

var lp = new[]
{
    Tuple.Create("Hello", "xyz"),
    Tuple.Create("Hello", "aaa"),
    Tuple.Create("Hello", "qwert"),
    Tuple.Create("Hello", "foo"),
    Tuple.Create("Hello", "pqr"),
    Tuple.Create("Hello", "abc"),
}.ToLookup(p => p.Item1, p => p.Item2);

foreach (var key in lp)
{
    foreach (var value in key)
    {
        Console.WriteLine("{0}: {1}", key.Key, value);
    }
}
于 2012-07-17T10:35:02.117 に答える
1

値を検索するには、キーが一意である必要があります。

于 2012-07-17T10:35:17.170 に答える
1

同じキーを数回追加できる独自のクラスを作成する必要があると思います。辞書はこれを行うための間違った方法です。

于 2012-07-17T10:35:49.667 に答える
1

なぜあなたはそれをしたいのですか。辞書の考え方はキーによる項目であり、それが複数回出現する場合、それはキーではありません。

> の辞書を作成することはできますが、必要に応じて再計画することをお勧めします。

于 2012-07-17T10:37:07.717 に答える
1

key value不可能です。この目的のためにフィールドを持つ独自のクラスを作成してください

于 2012-07-17T10:34:30.593 に答える