2009-03-06 45 views
138

我已經使用「select」關鍵字和擴展方法返回一個帶有LINQ的IEnumerable<T>,但我需要返回一個通用的Dictionary<T1, T2>,但無法弄清楚。我從以下類似的東西中學到了這個例子:選擇字典<T1, T2> with LINQ

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 }; 

我也對擴展方法做了同樣的事情。我認爲,因爲Dictionary<T1, T2>中的項可以迭代爲KeyValuePair<T1, T2>,所以我可以用上述示例中的「SomeClass」替換爲「new KeyValuePair<T1, T2> { ...」,但這樣做不起作用(Key和Value被標記爲只讀,所以我不能編譯這段代碼)。

這是可能的,還是我需要在多個步驟中做到這一點?

謝謝。

回答

221

該擴展方法還提供了一個ToDictionary擴展名。它的使用相當簡單,一般用法是爲鍵傳遞一個lambda選擇器並將該對象作爲值,但是您可以爲key和value傳遞一個lambda選擇器。

class SomeObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

SomeObject[] objects = new SomeObject[] 
{ 
    new SomeObject { ID = 1, Name = "Hello" }, 
    new SomeObject { ID = 2, Name = "World" } 
}; 

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name); 

然後objectDictionary[1]將包含值 「你好」

+3

+1 Whuh。這爲我創建新數據對象的方式開闢了新的可能性。 – Sung 2009-03-06 01:12:46

+1

太棒了,很高興你能夠使用它,我知道它在某些情況下幫助了我。 – 2009-03-06 01:28:40

34
var dictionary = (from x in y 
        select new SomeClass 
        { 
         prop1 = value1, 
         prop2 = value2 
        } 
       ).ToDictionary(item => item.prop1); 

這是假設SomeClass.prop1是字典所需Key

11

KeyValuePair的集合更加明確,並且執行得非常好。

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value);