【问题标题】:Double group into Dictionary<int, Dictionary<string, List<Model>>>()双组成 Dictionary<int, Dictionary<string, List<Model>>>()
【发布时间】:2021-10-04 13:03:34
【问题描述】:

我希望这可以通过 LINQ 解决,无需任何额外操作。

对于输入,我有一个模型列表:

public class Model 
{
  public int A { get; set; }
  public string B { get; set; }
  public int C { get; set; }
}

关于我应该得到的结果

Dictionary<int, Dictionary<string, List<Model>>>();

我已经尝试了下一个示例:

 var r = (from t in list
                    group t by new {t.A, t.B}
                    into grp
                    select new
                    {
                        grp.Key.A,
                        grp.Key.B,
                        Q = grp
                    }).ToList();

但它给我的不是我所期望的,有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    鉴于您有一个 List 类型的列表,您可以使用:

    var list = new List&lt;Model&gt;();

    var lookup = list.GroupBy(model =&gt; new { A = model.A, B = model.B }).GroupBy(grp =&gt; grp.Key.A).ToDictionary(grp =&gt; grp.Key, grp =&gt; grp.ToDictionary(subgrp =&gt; subgrp.Key.B, subgrp =&gt; subgrp.ToList()));

    您将看到变量lookup 具有您要查找的类型。

    它是如何工作的:

    通过第一个 GroupBy,您正在创建一个具有匿名键类型的 IGrouping,该类型具有成员 int A 和字符串 B。这是因为:

    因为匿名类型的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashcode 方法定义的,所以相同匿名类型的两个实例只有在它们的所有属性都相等时才相等。

    这是我几年前问过的question 的答案,如果你愿意,你可以检查它和@xanatos 的优秀答案。

    【讨论】:

    • 谢谢您,先生!你知道你在做什么)
    • 我添加了一些解释,以防您想扩展该技术或了解其工作原理。
    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多