我有以下字典:
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组添加到新列表中作为列表的单独元素....但在这种情况下,它并不是我真正想要的。我只想要整个字典中所有值的列表。
如果不循环遍历字典中的每个键值并创建我想要的列表,我怎样才能得到我所追求的内容?
答案 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(); 谢谢