Linq:将对象列表转换为字典,将对象成员作为值

时间:2011-08-25 07:04:32

标签: .net linq .net-4.0

我有一个类:

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个电话。

3 个答案:

答案 0 :(得分:7)

而不是Dictionary<Guid, List<int>>你可以使用Lookup<Guid, int>吗?这会让事情变得简单:

var lookup = list.ToLookup(x => x.Group, x => x.Value);

LookupDictionary非常相似,但设计为每个键使用多个值。有趣的区别在于,如果你获取一个缺失的密钥,你只需返回一个空序列而不是异常。

如果你可以使用它,那太好了。否则,您始终可以从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>