![](/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.