我希望这可以由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();但这并不是我所期望的,有什么办法解决这个问题吗?
发布于 2021-07-28 19:34:42
如果您有一个类型列表列表,则可以使用:
var list = new List<Model>();
var lookup = list.GroupBy(model => new { A = model.A, B = model.B }).GroupBy(grp => grp.Key.A).ToDictionary(grp => grp.Key, grp => grp.ToDictionary(subgrp => subgrp.Key.B, subgrp => subgrp.ToList()));
您将看到变量lookup具有您要寻找的类型。
它的工作原理:
通过第一个GroupBy,您将创建一个具有匿名密钥类型的IGrouping,该类型包含成员int A和字符串B。这是因为:
,因为匿名类型上的等于和GetHashCode方法是根据属性的相等和GetHashcode方法定义的,只有当它们的所有属性相等时,相同匿名类型的两个实例才是相等的。
这是我几年前问过的一个question的答案,如果你愿意的话,你可以检查它和@xanatos的优秀答案。
https://stackoverflow.com/questions/68566315
复制相似问题