双组成 Dictionary<int, Dictionary<string, List<Model>>>()

Posted

技术标签:

【中文标题】双组成 Dictionary<int, Dictionary<string, List<Model>>>()【英文标题】:Double group into 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();

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

【问题讨论】:

【参考方案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 的优秀答案。

【讨论】:

谢谢您,先生!你知道你在做什么) 我添加了一些解释,以防您想扩展该技术或了解其工作原理。 非常感谢!

以上是关于双组成 Dictionary<int, Dictionary<string, List<Model>>>()的主要内容,如果未能解决你的问题,请参考以下文章

如果键不存在,C# Dictionary<int, int> 查找会发生啥?

C#中Dictionary(数据字典)的用法总结

如何使用 WebAPI 返回 Dictionary<complexType,int>

为啥我不能用字符串为 Dictionary<String, Int> 下标?

如何插入从分配给 Dictionary<int, int> 的 SQL 表中提取的数据?(ASP.Net)

c# Dictionary拓展2个key得到1个value