1

我正在使用 C# 4.0。我想使用 IDictionary 存储(字符串,字符串)对。如下所示:

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

字典中不能有两个具有相同键的项目。但是,您可以拥有一个本身就是集合的项目:

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

你不能。字典只能为每个键保存一项。字典可能不是您要查找的数据结构。

于 2012-07-17T10:33:41.593 回答
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

你不能用字典来做到这一点。尝试使用 NameValueCollection。

于 2012-07-17T10:36:28.543 回答
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 回答
1

不可能,key value为此目的创建带有字段的自己的类

于 2012-07-17T10:34:30.593 回答
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 回答