2009-02-17 94 views
27

我有以下的解釋:如何獲取Dictionary <TKey,TValue>的所有值作爲IList <TValue>?

IDictionary<int, IList<MyClass>> myDictionary 

,我想獲得的字典作爲一個IList所有的值....


我想補充一點背景的至於我如何進入這種情況......

我有一個方法,讓我的MyClass列表。然後我有另一種方法將該列表轉換爲字典,其中鍵是MyClass的ID。稍後...並且無法訪問該原始列表...我需要獲取MyClass的原始未分組列表。


當我通過myDictionary.Values.ToList()給接受一個I​​List我得到的說,它不能從轉換編譯錯誤的方法

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

到:

System.Collections.Generic.IList<MyClass> 

現在,我可以理解它已經不存在了,並將每個IList組添加到新列表中作爲列表的單獨元素....但在這種情況下,它並不真正是我所追求的。我只想要整個字典中的所有值的列表。

那麼我怎樣才能得到我之後沒有循環遍歷字典中的每個鍵值並創建我想要的列表?

+1

我認爲你的問題可能是微調,說:「我只是希望所有在列表中包含在一個字典的鍵元素的列表」。字典中所有值的列表(您要求的)正是您所得到的:列表的列表。 – 2009-03-03 18:59:22

回答

39

由於字典(或散列表)的維護方式,這就是你要做的。內部實現包含密鑰,桶(用於衝突處理)和值。您可能能夠檢索的內部值列表,但你的更好的東西是這樣的:

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

它應該做的伎倆;)變平的SelectMany的結果,這意味着每個列表被連接成一個長序列(IEnumerable`1)。

0

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); 

注意,這是如此的效率極低,你應該重新考慮使用字典爲你想要實現的。

20

約翰的建議的變化:

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

如果你需要他們在列表中,你當然可以調用ToList的:

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

啊是的,我認爲Values屬性不能通過IDictionary`2接口訪問。 – 2009-02-18 08:17:03

44

注意到有很多答案都是很老。

這也將工作:

dict.Values.ToList(); 
+0

這對我有用 – Ziggler 2016-04-20 18:08:14

相關問題