特定值类型的字典扩展方法?例如字典<t,list <u =“”>&gt;

时间:2018-04-05 13:11:28

标签: c# .net

是否可以编写仅适用于以List作为值的字典的扩展方法?

我想编写一个检查密钥是否存在的密钥,它会在列表中添加另一个条目。如果密钥不存在,则初始化新列表,添加条目,然后将所有内容添加到字典中。

现在我不确定方法头是什么样的,或者甚至可以将函数限制为特定的值类型。

3 个答案:

答案 0 :(得分:2)

是的,当然。在扩展方法defintition中,您使用List<T>,其中T在类型参数中定义。在这种情况下命名为TListValue以避免歧义:

public static void DoSomething<TKey, TListValue>(this Dictionary<TKey, List<TListValue>> dictionary)
{
    ...
}

您可以在不指定类型参数的情况下使用它。应该感染它们:

Dictionary<string, List<string>> u = new Dictionary<string, List<string>>();
u.DoSomething();

答案 1 :(得分:0)

以下是您要编写的方法的示例实现:

static class DictExtensions {
    public static void Insert<TKey,TVal>(this IDictionary<TKey,List<TVal>> d, TKey k, TVal v) {
        List<TVal> current;
        if (!d.TryGetValue(k, out current)) {
            d.Add(k, new List<TVal> { v } );
        } else {
            current.Add(v);
        }
    }
}

名称Add会与Dictionary的实例方法发生冲突,因此我使用了名称Insert

Demo.

答案 2 :(得分:0)

我会亲自创建一个继承自Dictionary的类:

,而不是扩展方法
public class ListDictionary<TKey, TValue> : Dictionary<TKey, List<TValue>>
{
    new public List<TValue> this[TKey index]
    {
        get
        {
            List<TValue> list = null;
            if (!TryGetValue(index, out list))
            {
                list = new List<TValue>();
                Add(index, list);
            }
            return list;
        }
        set
        {
            if (ContainsKey(index))
                base[index] = value;
            else
                Add(index, value);
        }
    }
}

用法:

ListDictionary<string, string> dictionary = new ListDictionary<string, string>();

dictionary["list1"].Add("item1"); // list will be initialised here
dictionary["list1"].Add("item2");
dictionary["list2"].Add("item1"); // and another