如何将Dictionary <tkey,tvalue =“”>的所有值作为IList <tvalue>?</tvalue> </tkey,>

时间:2009-02-17 07:01:12

标签: c# .net-3.5 dictionary ilist

我有以下字典:

IDictionary<int, IList<MyClass>> myDictionary 

我希望将字典中的所有值都作为IList ....


只是添加一些背景知道我是如何进入这种情况的....

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


当我将myDictionary.Values.ToList()传递给一个接受IList的方法时,我得到一个编译错误,表明它无法从

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

为:

System.Collections.Generic.IList<MyClass>

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

如果不循环遍历字典中的每个键值并创建我想要的列表,我怎样才能得到我所追求的内容?

5 个答案:

答案 0 :(得分:71)

注意到很多答案都很老了。

这也有效:

using System.Linq;

dict.Values.ToList();

答案 1 :(得分:44)

由于字典(或哈希表)的维护方式,这就是你要做的。在内部,实现包含密钥,桶(用于冲突处理)和值。您可能能够检索内部值列表,但您最好使用以下内容:

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

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

答案 2 :(得分:22)

约翰建议的变体:

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

如果您在列表中需要它们,您当然可以调用ToList:

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

答案 3 :(得分: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);

请注意,这是非常低效的,你应该再考虑使用字典来实现你想要实现的目标。

答案 4 :(得分:-1)

dictionary.values.toList(); 如果你想得到总和就做 myDictionary.values.sum(); 谢谢