2011-08-25 73 views
2

我有一个类,如:的Linq:转换对象的名单字典,与对象成员作为价值

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进行批量处理,所以我确实需要字典(或者其中每个组都有一个值集合的东西) 。在这种情况下,每个组都被发送到资源,并且我想要批量发送该资源的所有值:如果我有10个组,每个组有50个值(列表总数为500个条目),我想使10个电话。

回答

2

给定一个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作为字典的键,然后选择ContainerClass对象的Value属性,并将其转换为List<int>以获取字典值。您可能并不需要Dictionary<ContainerClass>。如果你使用的ILookup<Guid, int>而不是OK,你可以这样做:

var lookup = objects.ToLookup(o => o.Group, o => o.Value); 
7

而非Dictionary<Guid, List<int>>你可以使用一个Lookup<Guid, int>?这将可以很容易:

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

一个Lookup很像Dictionary,而是设计了每个键多个值工作。有趣的区别在于,如果您获取缺少的键,则只会返回空序列而不是异常。

如果您可以使用,那很好。否则,你总是可以从LookupDictionary转换:

var dictionary = list.ToLookup(x => x.Group, x => x.Value) 
        .ToDictionary(x => x.Key, x => x.Value.ToList()); 
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());