【问题标题】:Linq: Convert list of object to dictionary, with an object member as valueLinq:将对象列表转换为字典,以对象成员为值
【发布时间】:2011-11-03 10:04:20
【问题描述】:

我有这样的课:

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&lt;guid, List&lt;ContainerClass&gt;&gt; 不同。

我知道我可以在拥有 IEnumerable 之后执行辅助 linq 查询来获取值条目,但这看起来很混乱;似乎应该有一种方法可以直接在单个语句中执行此操作。

编辑:注意,我知道 Lookup(),但在这种情况下,我实际上是按组进行批量处理,所以我确实需要字典(或者每个组都有一组值的东西)。在这种情况下,每个组都被发送到一个资源,我想批量发送该资源的所有值:如果我有 10 个组,每个组有 50 个值(我的列表中总共有 500 个条目),我想10 次通话。

【问题讨论】:

    标签: .net linq .net-4.0


    【解决方案1】:

    您可以使用Lookup&lt;Guid, int&gt; 而不是Dictionary&lt;Guid, List&lt;int&gt;&gt; 吗?这会很容易:

    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());
    

    【讨论】:

      【解决方案2】:

      我假设您有该类的多个实例,否则它是微不足道的。在 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());
      

      【讨论】:

        【解决方案3】:

        给定IEnumerable&lt;ContainerClass&gt; named objects,您可以这样做:

        var dict = objects
            .ToLookup(o => o.Group)
            .ToDictionary(grp => grp.Key, grp => grp.Select(o => o.Value).ToList());
        

        解释:

        ToLookup 方法将IEnumerable&lt;ContainerClass&gt; 转换为ILookup&lt;Guid, ContainerClass&gt;。然后ToDictionary 方法获取IGrouping&lt;Guid, ContainerClass&gt; 对象的集合,并选择分组的Key 作为字典的键,然后选择ContainerClass 对象的Value 属性,并将其转换为List&lt;int&gt; 用于字典值。

        您实际上可能不需要Dictionary&lt;ContainerClass&gt;。如果您可以改用ILookup&lt;Guid, int&gt;,则可以这样做:

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

        【讨论】:

          猜你喜欢
          • 2021-06-28
          • 2015-06-08
          • 2018-07-15
          • 1970-01-01
          • 2017-12-04
          • 2021-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多