C# IEnumerable<;T>;到IDictionary<;U、 IEnumerable<;T>&燃气轮机;
将C# IEnumerable<;T>;到IDictionary<;U、 IEnumerable<;T>&燃气轮机;,c#,.net,ienumerable,type-conversion,idictionary,C#,.net,Ienumerable,Type Conversion,Idictionary,将IEnumerable转换为IDictionary 其中,U是一个Guid,其信息保存在T的属性中 基本上,这会创建一个列表字典,其中原始列表中的所有项都基于对象中某个属性的值进行分组 示例 对象定义: class myObject { public Guid UID { get; set; } // other properties } 首先: IEnumerable<myObject> listOfObj; IEnumerable列表对象; 以: IDi
IEnumerable
转换为IDictionary
其中,U是一个Guid,其信息保存在T的属性中
基本上,这会创建一个列表字典,其中原始列表中的所有项都基于对象中某个属性的值进行分组
示例
对象定义:
class myObject
{
public Guid UID { get; set; }
// other properties
}
首先:
IEnumerable<myObject> listOfObj;
IEnumerable列表对象;
以:
IDictionary<Guid, IEnumerable<myObject>> dictOfLists;
i词典目录;
其中,listOfObj
包含UID属性具有许多不同但有时重叠值的对象。使用LINQ:
var dict = input.GroupBy(elem => elem.Identifier)
.ToDictionary(grouping => grouping.Key, grouping => grouping.Select(x => x));
我想你可能想要这样的东西:
var dictionary = list.GroupBy(i => i.Guid,
(guid, i) => new { Key = guid, i })
.ToDictionary(i => i.Key, i => i);
这将在公共Guid上对原始列表进行分组,然后给您一个以该Guid为键的字典。最有效的转换方法无疑是编写一个IDictionary
接口的实现,该接口在构造函数中接受一个IEnumerable
,并使用对给定IEnumerable
的查找动态执行所有操作。这样,转换本身就是O(1)
但是,这样的实现不会有好的性能(但这与转换效率无关)。作为“映射到一个或多个值的键集合”的ILookup
与IDictionary
不同,但它是等效的,并且在某些方面更好。这当然很容易创建:
var myLookup = listOfObj.ToLookup(x => x.UID);
你的解释有点令人困惑。如果您提供一个示例,可能会澄清问题。这将生成一个与
IDictionary
不完全相同的IDictionary
。或者使用.AsEnumerable()
而不是。Select()
。或者直接强制转换grouping
,因为IGrouping
继承自IEnumerable
asemerable
立即计算集合,而Select
保持延迟状态-因此Select
更可取,而且强制转换不会更改Select
之类的类型-调用者仍然可以将其强制转换回来,这也不是你想要的行为。@Femaref-我刚刚测试了它,而且AsEnumerable
肯定是延迟的。哦,我把它混在一起了-是的,它是延迟的,因为它只是返回传入的序列。但是,这仍然可以使调用方将其转换回您绝对不希望使用的任何实现(i分组
或类似的实现)。这构建了一个与i词典
不完全相同的i词典
@Remus-虽然它不是最漂亮的,上面的代码应该像预期的那样工作。谢谢-我也喜欢这里的想法。。。不过,我担心转换后的性能。