我有一个类:
public class ContainerClass
{
public guid Group { get; set; }
public int Value { get; set; }
}
包含在:
IEnumerable<ContainerClass>
如何将其转换为以下字典?
Dictionary<guid, List<int>>
我看过类似的问题(例如。
Create a dictionary on a list with grouping)但这与Dictionary<guid, List<ContainerClass>>
不同,这与我想要的不同。
我知道我可以执行辅助linq查询,以便在获得IEnumerable后获取值条目,但这看起来很混乱;似乎应该有一种方法可以在一个声明中直接执行此操作。
编辑:注意,我知道Lookup(),但在这种情况下,我实际上正在通过Group进行批量处理,所以我确实需要Dictionary(或者每个组都有一组Values的东西)。在这种情况下,每个组都被发送到一个资源,我想要批量发送该资源的所有值:如果我有10个组,每个组有50个值(总共列表中有500个条目),我想制作10个电话。
答案 0 :(得分:7)
而不是Dictionary<Guid, List<int>>
你可以使用Lookup<Guid, int>
吗?这会让事情变得简单:
var lookup = list.ToLookup(x => x.Group, x => x.Value);
Lookup
与Dictionary
非常相似,但设计为每个键使用多个值。有趣的区别在于,如果你获取一个缺失的密钥,你只需返回一个空序列而不是异常。
如果你可以使用它,那太好了。否则,您始终可以从Lookup
转换为Dictionary
:
var dictionary = list.ToLookup(x => x.Group, x => x.Value)
.ToDictionary(x => x.Key, x => x.Value.ToList());
答案 1 :(得分:4)
我假设你有多个类的实例,否则它是微不足道的。在LINQ中,类似的东西是:
var lookup = data.ToLookup(obj => obj.Group, obj => obj.Value);
然后你可以,例如:
foreach(var value in lookup[someGuid]) {
...
}
如果你真的需要它作为字典(而不是查找,它是接近的):
var lookup = data.GroupBy(obj => obj.Group).ToDictionary(
grp => grp.Key, grp => grp.Select(obj => obj.Value).ToList());
答案 2 :(得分:3)
给定IEnumerable<ContainerClass> named objects
,你可以这样做:
var dict = objects
.ToLookup(o => o.Group)
.ToDictionary(grp => grp.Key, grp => grp.Select(o => o.Value).ToList());
说明:
ToLookup
方法会将IEnumerable<ContainerClass>
转换为ILookup<Guid, ContainerClass>
。然后ToDictionary
方法获取IGrouping<Guid, ContainerClass>
个对象的集合,并选择分组的Key
作为字典的键,然后选择Value
属性{ {1}}对象,并将其转换为ContainerClass
的字典值。
您可能实际上不需要List<int>
。如果你可以改为使用Dictionary<ContainerClass>
,那么你可以这样做:
ILookup<Guid, int>