我有一个列表,其中包含我想要按属性值分组的元素。后来我想创建一个字典,其中key是我用来分组的值,值是每个组元素的列表(或IEnumerable)。
我正在尝试这样的事情:
Dictionary<long, Ienumerable<MyType>> dic = lstWithElements.GroupBy(x=>x.ID).ToDictionary(x=>x.????)
但是在ToDictionary
方法中,我没有ID属性。那么,我怎么能用分组的项目创建我的字典呢?
答案 0 :(得分:5)
GroupBy
that you're using的重载会返回IEnumerable<IGrouping<long, MyType>>
。 IGrouping<long, MyType>
提供类型为Key
的{{1}}属性,表示元素分组的预测值,并实现long
。
基本上,你需要的是:
IEnumerable<MyType>
注意:正如评论中所指出的,这会产生var dic = lstWithElements.GroupBy(x => x.ID).ToDictionary(x => x.Key);
。这不是一个真正的问题,只要你只是从字典中检索元素,而不是稍后尝试添加新的IDictionary<long, IGrouping<long, MyType>>
(这似乎不太可能)。如果您确实需要IEnumerable<MyType>
,请使用this answer中列出的代码。
答案 1 :(得分:4)
ToDictionary
方法有两个重载,但由于Dictionary
使用IEnumerable<MyType>
Value
,您可能对{{3}感兴趣}
Dictionary<long, IEnumerable<MyType>> dic = lstWithElements.GroupBy(x=>x.ID).ToDictionary(x=> x.Key, x => x.AsEnumerable());
答案 2 :(得分:1)
试试这个:
Dictionary<long, IGrouping<long,MyType>> dic = lstWithElements.GroupBy(x=>x.ID).ToDictionary(x=>x.Key)
答案 3 :(得分:1)
我认为,您的数据结构至少是这样的:
class MyType //or struct
{
long ID;
};
你想要一个清单:
List<MyType> list;//with instances of MyType
具有不同的MyType实例和相同的ID(使ID不唯一,不是最佳设计)或者某些实例在列表中多次出现,这似乎是更好的情况,但要么问题要么适用。
现在,GroupBy,它做什么?列表
List<MyType>
转换为
IEnumerable<MyType>
然后GroupBy(x =&gt; x.ID)正在分组并提供:
IEnumerable<IGrouping<long, MyType>>
所以我们得到了
的元素IGrouping<long, MyType>
现在IGrouping知道IEnumerable所做的一切,接口继承,还有Key。因此,如果您需要预期的字典类型:
Dictionary<long,IEnumerable<MyType>>
你必须这样做:
var dictionary =
list
.GroupBy(x => x.ID)
.ToDictionary(x => x.ID, x => x.AsEnumerable())
;
ToDictionary允许从元素中选择Key并且还允许转换为给定键存储的Value,因此我们可以使用此方法并调用
x.AsEnumerable()
因为IGrouping是从IEnumerable继承的。
希望这个更长的解释有助于:)。