IEnumerable <t>到IDictionary <u,ienumerable <t =“”>&gt; </u,> </t>

时间:2011-02-28 20:24:23

标签: c# .net ienumerable type-conversion idictionary

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属性有许多不同但有时重叠的值的对象。

4 个答案:

答案 0 :(得分:5)

使用LINQ:

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

答案 1 :(得分:2)

转换大多数有效方法肯定是编写IDictionary<U, IEnumerable<T>>接口的实现,它在构造函数中接受IEnumerable<T>,并实现使用查找到给定IEnumerable<T>的所有操作。这样转换本身就是O(1)。

然而,这样的实现效果不佳(但这与转换效率无关)。

答案 2 :(得分:2)

ILookup<U,T>作为“映射到一个或多个值的键集合”与IDictionary<U, IEnumerable<T>>不同,但它是等效的,并且在某些方面更好。它很容易创建:

var myLookup = listOfObj.ToLookup(x => x.UID);

答案 3 :(得分:0)

我想你可能想要这样的东西:

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

这会将原始列表分组到常用的Guids上,然后给你一个以Guid为键的字典。