.Net中NameValueCollection的通用形式

时间:2011-03-06 08:29:36

标签: c# .net generics

.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>>,还有其他选择吗?

此致 哎呀

4 个答案:

答案 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>,这可能有所帮助。