2013-04-16 66 views
2

我有一个函数返回IDictionary<TKey, List<TValue> >
我有另一个功能,需要一个IDictionary<TKey, IEnumerable<TValue> >如何将IDictionary <TKey,列表<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> >?

+0

只是好奇,你想要做什么的目的是什么? –

+0

嗯,能够通过做一个似乎没有必要的转换来调用我的第二个功能而不会浪费时间! –

+1

如果你想O(1)。只需在它周围写一个包装。我没有看到这个问题,虽然'列表'已经是'IEnumerable '。转换在哪里? – leppie

回答

1

考虑你的第二个功能,一个

takes a IDictionary<TKey, IEnumerable<TValue> > 

现在,如果你给我一个IDictionary<TKey, IEnumerable<TValue>>,一个的事情,我应该可以做的是设置new TValue[]的其中一个键的值,对吧?毕竟,TValue[]IEnumerable<TValue>,所以它符合约束条件。

但是,如果不知为何,你会给出什么样我是(下面的接口)一个IDictionary<TKey, List<TValue>>,我绝对不应该允许设置一键一TValue[]的价值,因为TValue[]不是List<TValue>

这正是你连接的问题中的问题,当然。

现在,如果你乐意永远只我传给你的参数,你从词典移动到ILookup<TKey, TValue>,这是有一个潜在的解决方案有点像只读从关键字典到一个列表的值。如果您的方法分别返回并接受ILookup<TKey, TValue>,那当然没有问题。

+0

ILookup是一个不错的解决方案。太糟糕了,它不支持空列表。 –

+0

@ Scorpi0是一个问题,因为当您查找关键字时,[“如果在集合中找不到该关键字,则会返回一个空序列”](http://msdn.microsoft.com/zh-cn/library/default.aspx /library/bb292716.aspx)? – AakashM

+0

不是。我有一些基于字典中存在的键的逻辑。因此,如果密钥不存在,那么我无法轻松检索。侧面的问题:我不能安装框架4.5,但[ReadOnlyDictionary](http://msdn.microsoft.com/en-us/library/gg712875.aspx)可以做的伎俩?我无法测试它。 –

相关问题