2011-02-28 101 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); 
相关问题