2011-02-28 138 views
3

什麼是最有效的方式,以一個IEnumerable<T>轉換爲IDictionary<U, IEnumerable<T>>IEnumerable的<T>到的IDictionary <U,IEnumerable的<T>>

其中U例如一個GUID,用於將信息在T的財產持有

基本上,這將創建一個列表字典,其中原始列表中的所有項目都基於對象內某個屬性的值進行分組。

對象定義:

class myObject 
{ 
    public Guid UID { get; set; } 

    // other properties 
} 

開始:

IEnumerable<myObject> listOfObj; 

末有:

IDictionary<Guid, IEnumerable<myObject>> dictOfLists; 

在哪裏由listOfObj包含的對象具有許多不同但有時重疊的UID屬性值。

+0

您的解釋有些混亂。也許如果你提供一個例子,它會清除一切。 – 2011-02-28 20:27:54

+0

我希望這個例子可以幫助 – Remus 2011-02-28 20:35:20

回答

5

使用LINQ:

var dict = input.GroupBy(elem => elem.Identifier) 
       .ToDictionary(grouping => grouping.Key, grouping => grouping.Select(x => x)); 
+0

這會建立一個'IDictionary >',它與'IDictionary >'不完全一樣。 – Remus 2011-02-28 20:45:36

+1

只需在它後面添加一個選擇。 – Femaref 2011-02-28 20:51:45

+0

或使用'.AsEnumerable()'而不是'.Select()'。或者只是施加'分組',因爲'IGrouping '繼承'IEnumerable ' – 2011-02-28 22:07:04

0

我想你可能想是這樣的:

var dictionary = list.GroupBy(i => i.Guid, 
           (guid, i) => new { Key = guid, i }) 
        .ToDictionary(i => i.Key, i => i); 

這組共同的GUID的原始名單,然後給你與GUID作爲關鍵一本字典。

+0

這會建立一個'IDictionary >',它與'IDictionary >'不完全一樣。 – Remus 2011-02-28 20:47:08

+1

@Remus - 雖然它不是最漂亮的,但上面的代碼應該按預期工作。 – 2011-02-28 20:54:15

2

有效的方式來轉換肯定是寫IDictionary<U, IEnumerable<T>>接口,它接受在構造函數中的IEnumerable<T>,並實現使用查找到給定的IEnumerable<T>飛所有操作的實現。這樣轉換本身就是O(1)。

但是,這樣的實現將不會有很好的性能(但這與轉換效率無關)。

+0

謝謝 - 我喜歡這裏的想法......我擔心轉換後的表現。 – Remus 2011-02-28 20:54:07

2

ILookup<U,T>作爲「映射到一個或多個值的鍵的集合」與IDictionary<U, IEnumerable<T>>不同,但它是等同的,並且在某些方面更好。這當然很容易創建:

var myLookup = listOfObj.ToLookup(x => x.UID); 
相關問題