将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 :(得分: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为键的字典。