词典字典的扩展方法

时间:2009-05-26 13:10:30

标签: c# dictionary extension-methods

我正在尝试编写一个扩展方法,将数据插入到字典字典中,如下所示:

items=Dictionary<long,Dictionary<int,SomeType>>()

到目前为止我所拥有的是:

    public static void LeafDictionaryAdd<TKEY1,TKEY2,TVALUE>(this IDictionary<TKEY1,IDictionary<TKEY2,TVALUE>> dict,TKEY1 key1,TKEY2 key2,TVALUE value)
    {
        var leafDictionary = 
            dict.ContainsKey(key1) 
                ? dict[key1] 
                : (dict[key1] = new Dictionary<TKEY2, TVALUE>());
        leafDictionary.Add(key2,value);
    }

但编译器不喜欢它。声明:

items.LeafDictionaryAdd(longKey, intKey, someTypeValue);

给了我一个类型推断错误。

声明:

items.LeafDictionaryAdd<long, int, SomeType>(longKey, intKey, someTypeValue);

我得到“......不包含...的定义,最好的扩展方法重载有一些无效的参数。

我做错了什么?

4 个答案:

答案 0 :(得分:8)

一些创造性的通用用法;-p

class SomeType { }
static void Main()
{
    var items = new Dictionary<long, Dictionary<int, SomeType>>();
    items.Add(12345, 123, new SomeType());
}

public static void Add<TOuterKey, TDictionary, TInnerKey, TValue>(
        this IDictionary<TOuterKey,TDictionary> data,
        TOuterKey outerKey, TInnerKey innerKey, TValue value)
    where TDictionary : class, IDictionary<TInnerKey, TValue>, new()
{
    TDictionary innerData;
    if(!data.TryGetValue(outerKey, out innerData)) {
        innerData = new TDictionary();
        data.Add(outerKey, innerData);
    }
    innerData.Add(innerKey, value);
}

答案 1 :(得分:2)

尝试使用具体类型:

public static void LeafDictionaryAdd<TKEY1,TKEY2,TVALUE>(this IDictionary<TKEY1, Dictionary<TKEY2,TVALUE>> dict,TKEY1 key1,TKEY2 key2,TVALUE value)

请参阅 Dictionary<TKEY2,TVALUE> 而不是IDictionary<TKEY2,TVALUE>

答案 2 :(得分:2)

我猜这是一个协方差/逆变问题。您的方法签名期望IDcitionaries的IDictionary,但您传递它是Dictionary的IDictionary。尝试在方法签名中使用具体的Dictionary,作为内部词典。

答案 3 :(得分:1)

如果在参数列表中为Extension方法指定IDictionary, 那么你的物品就不会与之相符。

将您的分机更改为

public static void LeafDictionaryAdd<TKEY1,TKEY2,TVALUE>(
    this IDictionary<TKEY1, Dictionary<TKEY2,TVALUE>> dict,
    TKEY1 key1,
    TKEY2 key2,
    TVALUE value)

或尝试将您的项目投射到

((IDictionary<long, IDictionary<int, YourType>>)items).LeafDictionaryAdd(l, i, o);