![](/img/trans.png)
[英]How to get type of TKey and TValue given a Dictionary<TKey,TValue> type
[英]How do I get all the values of a Dictionary<TKey, TValue> as an IList<TValue>?
我有以下字典:
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 的每个组作为列表的单独元素添加到新列表中......但在这种情况下,它并不是我真正想要的。 我只想要整个字典中所有值的列表。
那么如何在不遍历字典中的每个键值并创建我想要的列表的情况下获得我想要的内容?
注意到很多答案都很旧。
这也将起作用:
using System.Linq;
dict.Values.ToList();
由于字典(或哈希表)的维护方式,这就是您要做的。 在内部,实现包含键、桶(用于冲突处理)和值。 您可能能够检索内部值列表,但您最好使用以下内容:
IDictionary<int, IList<MyClass>> dict;
var flattenList = dict.SelectMany( x => x.Value );
它应该可以解决问题;) SelectMany 将结果展平,这意味着每个列表都被连接成一个长序列 (IEnumerable`1)。
约翰建议的变体:
var flattenedValues = dict.Values.SelectMany(x => x);
如果您在列表中需要它们,您当然可以调用 ToList:
var flattenedList = dict.Values.SelectMany(x => x).ToList();
dictionary.values.toList();
如果你想得到 Sum 就做
myDictionary.values.sum();
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);
请注意,这是非常低效的,您应该再次考虑使用字典来实现您的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.