69

我有以下字典:

IDictionary<int, IList<MyClass>> myDictionary 

我想将字典中的所有值作为 IList....


只是为了添加一点背景知识,说明我是如何陷入这种境地的……

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


当我将 myDictionary.Values.ToList() 传递给采用 IList 的方法时,我收到一个编译错误,指出它无法从

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

到:

System.Collections.Generic.IList<MyClass>

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

那么如何在不遍历字典中的每个键值并创建我想要的列表的情况下获得我想要的东西呢?

4

5 回答 5

119

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

这也将起作用:

using System.Linq;

dict.Values.ToList();
于 2015-11-10T15:16:17.573 回答
70

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

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

它应该可以解决问题;) SelectMany 使结果变平,这意味着每个列表都连接成一个长序列(IEnumerable`1)。

于 2009-02-17T07:18:05.347 回答
31

约翰建议的变体:

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

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

var flattenedList = dict.Values.SelectMany(x => x).ToList();
于 2009-02-17T07:24:10.857 回答
2
dictionary.values.toList();

如果你想得到 Sum 就做

myDictionary.values.sum();
于 2020-05-12T21:53:09.593 回答
0

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

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

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

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

于 2009-02-17T07:22:26.147 回答