【问题标题】:Create a dictionary on a list with grouping在带有分组的列表上创建字典
【发布时间】:2010-10-30 14:20:12
【问题描述】:

我在列表中有以下对象:

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

现在,我想从中创建以下字典:

Dictionary<int, List<DemoClass>>

我想按属性GroupKeyList&lt;DemoClass&gt; 进行分组,但我不明白这是如何完成的,需要一些帮助。

经过一番思考,我实现了所需的行为:

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

但是,有没有办法把它变成一条语句?

【问题讨论】:

    标签: c# .net linq .net-3.5


    【解决方案1】:

    只是为了把mquander's suggestion具体化:

    var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                                 .GroupBy(x => x.GroupKey)
                                 .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
    

    当然,如果你也使用更短的变量名,你会使其更短:)

    但是,我是否可以建议Lookup 可能更合适?查找基本上是从键到 IEnumerable&lt;T&gt; 的字典 - 除非您真的需要将值作为列表,否则使用 ToLookup 调用可以使代码更短(并且更高效):

    var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                                 .ToLookup(x => x.GroupKey);
    

    【讨论】:

    • 我认为在长期环境中,与构建的字典相比,查找的性能不是那么好,因为它为每个请求建立了新鲜的结果......请纠正我,如果我'我错了!
    • 不,它会创建整个查找。一般来说,ToXXX 不使用延迟执行。
    • (你可能会想到分组,这确实是延迟的。)
    • 如果我不是那么恶意,我会投票给你。为 Linq 而来,为我从未听说过的数据结构而停留!
    • @sasikt:模型是你可以查找anything,如果键不存在,你只会得到一个空集合。这通常比 IMO 的 TryGetValue 方法更有用。
    【解决方案2】:
    var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                              group demoClass by demoClass.GroupKey
                              into groupedDemoClass
                              select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
    

    这个可以用!!!

    【讨论】:

      【解决方案3】:

      你已经把它做成了单线。只需将ToDictionary 放在第一行的末尾即可。如果您希望它更短,请使用功能组合语法而不是查询语法。

      【讨论】:

        【解决方案4】:

        我在这里稍微偏离主题,但我进入了这个线程,因为我正在寻找一种在 Linq 中创建字典字典的方法,这里的对话将我引向回答...

        可以使用 linq 创建多级词典,这对于您有多个要搜索的键或维度的情况很有用。诀窍是创建一个分组,然后将其转换为字典,如下所示:

          Dim qry = (From acs In ActualSales _
                     Group By acs.ProductID Into Group _
                     Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
                    ).ToDictionary(Function(c) c.ProductID)
        

        生成的查询可以按如下方式使用:

         If qry.ContainsKey(_ProductID) Then
              With qry(_ProductID)
                  If .Months.ContainsKey(_Period) Then
                     ...
                  End If
              End With
         End If
        

        希望这对需要此类查询的其他人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-01
          • 2018-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多