如何获得 Dictionary < TKey,TValue > 的所有值作为 IList < TValue > ?

我有一本以下的字典:

IDictionary<int, IList<MyClass>> myDictionary

我希望得到字典中所有的值作为 IList... ..。


我只是想补充一点背景知识,告诉你我是怎么陷入这种境地的。

我有一个方法可以得到 MyClass 的列表。然后我有另一个方法,它将这个列表转换成一个字典,其中键为 MyClass 的 id。稍后... ... 在无法访问原始列表的情况下... ... 我需要获得 MyClass 的原始未分组列表。


当我通过我的字典。我得到一个编译错误,说它不能从

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

致:

System.Collections.Generic.IList<MyClass>

现在,我可以理解它消失了,并且把每个 IList 组作为单独的元素添加到新的列表中... ... 但是在这个例子中,它并不是我真正想要的。我只需要整个字典中所有值的列表。

那么,如果不循环遍历字典中的每个键值并创建我想要的列表,我如何才能得到我想要的东西呢?

117331 次浏览

因为字典(或哈希表)是如何维护的,所以这就是您要做的。在内部,实现包含键、桶(用于冲突处理)和值。你也许可以检索到内部价值列表,但是你最好使用下面这样的东西:

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

它应该可以做到这一点;) SelectMany 将结果变平,这意味着每个列表都被连接成一个长序列(IEnumable‘1)。

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

如果您真正想要的是一个平面的“ IList”,那么除了循环遍历每个值之外,没有其他解决方案:

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

请注意,这非常低效,因此您应该重新考虑使用字典来实现您想要实现的目标。

约翰建议的一个变体:

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

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

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

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

这也会奏效:

using System.Linq;


dict.Values.ToList();
dictionary.values.toList();

如果你想得到心姐,就去做吧

myDictionary.values.sum();