2009-02-17 93 views
27

我有以下的解释:如何获取Dictionary <TKey,TValue>的所有值作为IList <TValue>?

IDictionary<int, IList<MyClass>> myDictionary 

,我想获得的字典作为一个IList所有的值....


我想补充一点背景的至于我如何进入这种情况......

我有一个方法,让我的MyClass列表。然后我有另一种方法将该列表转换为字典,其中键是MyClass的ID。稍后...并且无法访问该原始列表...我需要获取MyClass的原始未分组列表。


当我通过myDictionary.Values.ToList()给接受一个I​​List我得到的说,它不能从转换编译错误的方法

System.Collections.Generic.List<System.Collections.Generic.IList<MyClass>> 

到:

System.Collections.Generic.IList<MyClass> 

现在,我可以理解它已经不存在了,并将每个IList组添加到新列表中作为列表的单独元素....但在这种情况下,它并不真正是我所追求的。我只想要整个字典中的所有值的列表。

那么我怎样才能得到我之后没有循环遍历字典中的每个键值并创建我想要的列表?

+1

我认为你的问题可能是微调,说:“我只是希望所有在列表中包含在一个字典的键元素的列表”。字典中所有值的列表(您要求的)正是您所得到的:列表的列表。 – 2009-03-03 18:59:22

回答

39

由于字典(或散列表)的维护方式,这就是你要做的。内部实现包含密钥,桶(用于冲突处理)和值。您可能能够检索的内部值列表,但你的更好的东西是这样的:

IDictionary<int, IList<MyClass>> dict; 
var flattenList = dict.SelectMany(x => x.Value); 

它应该做的伎俩;)变平的SelectMany的结果,这意味着每个列表被连接成一个长序列(IEnumerable`1)。

0

Values获取包含字典值的ICollection。正如您的字典的定义所暗示的那样,它可以定义为一个ICollection<IList<MyClass>>集合。所以如果你真的想要一个IList<IList<MyClass>>,使用spacedog的解决方案。

如果你真正想要的是一台'的IList”,那么有没有其他的解决办法不是通过每个值循环:

IList<MyClass> l=new List<MyClass>(); 
foreach (IList<MyClass> v in myDictionary.Values) 
    l.AddRange(v); 

注意,这是如此的效率极低,你应该重新考虑使用字典为你想要实现的。

20

约翰的建议的变化:

var flattenedValues = dict.Values.SelectMany(x => x); 

如果你需要他们在列表中,你当然可以调用ToList的:

var flattenedList = dict.Values.SelectMany(x => x).ToList(); 
+0

啊是的,我认为Values属性不能通过IDictionary`2接口访问。 – 2009-02-18 08:17:03

44

注意到有很多答案都是很老。

这也将工作:

dict.Values.ToList(); 
+0

这对我有用 – Ziggler 2016-04-20 18:08:14

相关问题