【问题标题】:How do I get all the values of a Dictionary<TKey, TValue> as an IList<TValue>?如何将 Dictionary<TKey, TValue> 的所有值作为 IList<TValue> 获取?
【发布时间】:2010-10-08 00:45:33
【问题描述】:

我有以下字典:

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 的每个组作为列表的单独元素添加到新列表中......但在这种情况下,它并不是我真正想要的。我只想要整个字典中所有值的列表。

如果不遍历字典中的每个键值并创建我想要的列表,我怎样才能得到我想要的呢?

【问题讨论】:

  • 我认为您的问题可能已被微调为“我只想要字典键中包含的列表中所有元素的列表”。字典中所有值的列表(您要求的)正是您得到的:列表列表。

标签: c# .net-3.5 dictionary ilist


【解决方案1】:

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

这也可以:

using System.Linq;

dict.Values.ToList();

【讨论】:

  • 很简单,答案应该改成这样。
  • @rolls 不,因为dict.Values.ToList()dict.Values.SelectMany(x =&gt; x) 不同,后者产生一个列表列表,而SelectMany 将结果列表展平并连接成一个序列。
  • 我不知道为什么会有这么多赞成票。这根本没有解决@JohnLeidegren 提到的问题......它不会“压平”字典值
  • 标题只是误导。我也只是想获得这份清单,因此效果很好。
  • 有什么方法可以将其更改为选定的答案吗?
【解决方案2】:

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

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

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

【讨论】:

  • 基数不匹配。它是一个列表字典,如果你想要一个所有元素的单维序列,你需要使用SelectMany 它将列表集合扁平化为一个序列。
【解决方案3】:

John 建议的变体:

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

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

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

【讨论】:

  • 啊,是的,我认为 Values 属性无法通过 IDictionary`2 接口访问。
【解决方案4】:
dictionary.values.toList();

如果你想得到 Sum 就这样做

myDictionary.values.sum();

【讨论】:

    【解决方案5】:

    Values 得到一个包含字典值的ICollection。正如您的字典的定义所暗示的那样,它可以定义为ICollection&lt;IList&lt;MyClass&gt;&gt; 集合。所以如果你真的想要IList&lt;IList&lt;MyClass&gt;&gt;,请使用spacedog 的解决方案。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-14
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      相关资源
      最近更新 更多