.Net是否提供NameValueCollection的通用形式或替代
Dictionary<string,List<T>>
?
像
这样的东西Person john = new Person();
...
Person vick = new Person();
...
NameValueCollection<Person> stringToPerson = new NameValueCollection<Person>();
stringToPerson.Add("John",john)
stringToPerson.Add("Vick",vick)
实际上在我的情况下我被迫依赖Dictionary<string,List<Peron>>
,还有其他选择吗?
此致 哎呀
答案 0 :(得分:3)
最接近的替代方案可能是ILookup<TKey, TElement>
界面。目前,在BCL中实现它的唯一公共类型是不可变Lookup<TKey, TElement>
类,其实例可以使用Enumerable.ToLookup
方法创建。如果你想要一个实现接口的可变类型,你必须自己写一个;您可以找到示例实现here。
在您的情况下,您可能需要ILookup<string, Person>
。
答案 1 :(得分:3)
据我所知,BCL没有内置这样的东西。我会编写自己的类,在内部包装Dictionary<string, List<T>>
并公开适当的方法(例如,Add
可以为给定键的List<T>
添加元素。
例如:
class NameValueCollection<T>
{
Dictionary<string, List<T>> _dict = new Dictionary<string, List<T>>();
public void Add(string name, T value)
{
List<T> list;
if (!_dict.TryGetValue(name, out list))
{
_dict[name] = list = new List<T>();
}
list.Add(value);
}
// etc.
}
答案 2 :(得分:2)
哦,我明白你现在想做什么。您希望能够添加到Person集合,而无需每次都创建新的List。救援的延伸方法!
public static void SafeAdd<TValue>(this IDictionary<TKey, ICollection<TValue>> dict, TKey key, TValue value)
{
HashSet<T> container;
if (!dict.TryGetValue(key, out container))
{
dict[key] = new HashSet<TValue>();
}
dict[key].Add(value);
}
Usage:
var names = new Dictionary<string, ICollection<Person>>();
names.SafeAdd("John", new Person("John"));
答案 3 :(得分:1)
没有内置;有Lookup<TKey,TValue>
作为多地图运行,但这是不可变的。我为MiscUtil写了一个可变的EditableLookup<TKey,TValue>
,这可能有所帮助。