我有一个返回IDictionary<TKey, List<TValue> >
的函数
我有另一个函数需要IDictionary<TKey, IEnumerable<TValue> >
。
我需要将第一个函数的返回值传递给第二个函数 编译器不希望将第一个转换为第二个。那么如何在O(1)中将第一个转换为第二个呢?
我总是可以写一个转换函数
public static IDictionary<TKey, IEnumerable<TValue>> ToIEnumerable<TKey, TValue>(this IDictionary<TKey, List<TValue>> source)
{
return source.ToDictionary(s => s.Key, s => s.Value.AsEnumerable());
}
但我很确定这不是O(1),更像是O(log n)。
答案 0 :(得分:1)
考虑你的第二个功能,即
takes a IDictionary<TKey, IEnumerable<TValue> >
现在,如果你给我一个IDictionary<TKey, IEnumerable<TValue>>
,我应该做的一件事就是将其中一个键的值设置为new TValue[]
,对吧?毕竟,TValue[]
是IEnumerable<TValue>
,因此符合约束条件。
但是,如果您给我的某些内容(在界面下方)IDictionary<TKey, List<TValue>>
,我绝对不应该 将密钥的值设置为{ {1}},因为TValue[]
不是TValue[]
!
当然,这正是你所链接的问题中的问题。
现在,如果您只是读取我通过的参数,那么您可以从词典转移到ILookup<TKey, TValue>
,这有点像从键到列表值的只读字典。如果你的方法分别返回并接受List<TValue>
,那当然没问题。