3

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

4 回答 4

5

使用 LINQ:

var dict = input.GroupBy(elem => elem.Identifier)
                .ToDictionary(grouping => grouping.Key, grouping => grouping.Select(x => x));
于 2011-02-28T20:27:46.077 回答
2

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

然而,这样的实现不会有很好的性能(但这与转换效率无关)。

于 2011-02-28T20:30:49.783 回答
2

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

var myLookup = listOfObj.ToLookup(x => x.UID);
于 2011-02-28T21:44:02.980 回答
0

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

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

这会将原始列表分组到常见的 Guid 上,然后为您提供一个以该 Guid 作为键的字典。

于 2011-02-28T20:28:36.247 回答