我正在尝试编写一个扩展方法,它将IDictionary<K, S<V>>
持有任何类型的集合/序列(S<V>
)转换ILookup<K, V>
为在这些情况下更合适的数据结构。这意味着我希望我的扩展能够在不同的S
类型和接口上工作:
IDictionary<K, IEnumerable<V>>
IDictionary<K, ICollection<V>>
IDictionary<K, List<V>>
等理想情况下,我不想为每个可能的集合类型编写单独的实现,我希望类型推断能够完成它的工作。
我试过的是:
public static ILookup<TKey, TValue>ToLookup<TKey, TCollection, TValue>(
this IDictionary<TKey, TCollection> dictionary)
where TCollection : IEnumerable<TValue>
但它TValue
在参数列表中没有,因此类型推断无法弄清楚 - 我得到“方法 ToLookup 的类型参数无法从用法中推断出来”。
TValue
除了在方法中添加 fake -typed 参数之外,它是否有可能以其他方式工作?
预期用法示例
我希望上述所有调用都是可能的,并导致调用我的单个扩展方法:
var dictOfIEnumerables = new Dictionary<int, IEnumerable<int>>();
var lookupFromIEnumerables = dictOfIEnumerables.ToLookup();
var dictOfICollections = new Dictionary<int, ICollection<int>>();
var lookupFromICollections = dictOfICollections.ToLookup();
var dictOfLists = new Dictionary<int, List<int>>();
var lookupFromLists = dictOfLists.ToLookup();