2

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

这里有一个相关问题:嵌套接口:Cast IDictionary< TKey, IList< TValue >> to IDictionary< TKey, IEnumerable < TValue>>?

4

1 回答 1

1

考虑您的第二个功能,即

 takes a IDictionary<TKey, IEnumerable<TValue> >

现在,如果你给我 a IDictionary<TKey, IEnumerable<TValue>>,我应该能够做的一件事就是将其中一个键的值设置为 a new TValue[],对吧?毕竟, aTValue[]是一个IEnumerable<TValue>,所以它满足约束。

但是,如果你给我的东西是(在界面下面) a IDictionary<TKey, List<TValue>>,我绝对不应该被允许将 a 的值设置为 a TValue[],因为 aTValue[]不是 a List<TValue>

当然,这正是您所链接的问题中的问题。

现在,如果您很高兴只阅读我传递给您的参数,那么您有一个从字典移动到 的潜在解决方案ILookup<TKey, TValue>,这有点像从键到值列表的只读字典。如果您的方法分别返回和接受,当然没有问题。ILookup<TKey, TValue>

于 2013-04-16T10:03:16.117 回答