如何从分组元素创建字典?

时间:2015-10-07 16:44:31

标签: c# linq

我有一个列表,其中包含我想要按属性值分组的元素。后来我想创建一个字典,其中key是我用来分组的值,值是每个组元素的列表(或IEnumerable)。

我正在尝试这样的事情:

Dictionary<long, Ienumerable<MyType>> dic = lstWithElements.GroupBy(x=>x.ID).ToDictionary(x=>x.????)

但是在ToDictionary方法中,我没有ID属性。那么,我怎么能用分组的项目创建我的字典呢?

4 个答案:

答案 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继承的。

希望这个更长的解释有助于:)。