我正在使用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中存储相同的密钥?
答案 0 :(得分: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");
答案 1 :(得分: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");
答案 2 :(得分:2)
你做不到。字典只能为每个键保存一个项目。 字典可能不是您要查找的数据结构。
答案 3 :(得分: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");
答案 4 :(得分:2)
您无法使用IDictionary执行此操作。尝试使用NameValueCollection。
答案 5 :(得分: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(); }
}
}
答案 6 :(得分:1)
不可能,为此目的创建包含字段key
value
的自己的类
答案 7 :(得分: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);
}
}
答案 8 :(得分:1)
键必须是唯一的才能搜索值。
答案 9 :(得分:1)
我认为您必须创建自己的类,您可以多次添加相同的键。 字典是错误的方法。
答案 10 :(得分:1)
为什么你会这样做。 字典的概念是按键的项目,如果它更多,那么一旦它不是关键。
你可以创建&gt;字典但是你最好重新计划你的需求。