如何转换IDictionary <tkey,list <tvalue =“”>&gt;到IDictionary <tkey,ienumerable <tvalue =“”>&gt;?</tkey,> </tkey,>

时间:2013-04-16 09:38:46

标签: c# .net performance dictionary ienumerable

我有一个返回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)。

此处有相关问题:Nested Interfaces: Cast IDictionary< TKey, IList< TValue > > to IDictionary< TKey, IEnumerable < TValue> >?

1 个答案:

答案 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>,那当然没问题。