我有这门课:
class Foo
{
Category1 Cat1;
Category2 Cat2;
Category3 Cat3;
decimal Weight;
}
Run Code Online (Sandbox Code Playgroud)
每个人Categoryi都有一个string Name属性
所以一个列表Foos可能是这样的:
Cat1 Cat2 Cat3 Weight
--------------------------------
AP SG X 10
AP SG S 5
AP J X 5
AP AR S 10
NE R L 7
...
Run Code Online (Sandbox Code Playgroud)
我想从列表中创建一棵树。即:
一个节点列表,作为一个节点:
class Node
{
string Name;
decimal Weight;
List<Node> Children;
}
Run Code Online (Sandbox Code Playgroud)
使用此层次结构顺序:Category1、Category2、Category3,树将如下所示:
|--AP (Weight: 30)
| |
| |--SG (Weight: 15)
| | |-- X (Weight: 10)
| | |-- S (Weight: 5)
| |
| |--J (Weight: 5)
| | |-- X (Weight: 5)
| |
| |--AR (Weight: 10)
| |-- S (Weight: 10)
|
|--NE (Weight: 7)
|
|-- R (Weight: 7)
|-- L (Weight: 7)
Run Code Online (Sandbox Code Playgroud)
问题:实现这一目标的最优雅的方法是什么?我正在使用 LINQ 进行查询。
我知道我可以分组Cat1,即:list.GroupBy(r => new { r.Cat1 }),然后在每个组中进行迭代,在每个组内我可以按 Cat2 等进行分组,等等。但它似乎不是很优雅,而且它也非常依赖于层次结构顺序......
你可以这样做:
var nodes = list
.GroupBy(c1 => c1.Cat1.Name)
.Select(c1 => new Node
{
Name = c1.Key,
Weight = c1.Sum(x => x.Weight),
Children = c1
.GroupBy(c2 => c2.Cat2.Name)
.Select(c2 => new Node
{
Name = c2.Key,
Weight = c2.Sum(x => x.Weight),
Children = c2.Select(c3 => new Node
{
Name = c3.Cat3.Name,
Weight = c3.Weight,
Children = new List<Node>()
}).ToList()
}).ToList()
}).ToList();
Run Code Online (Sandbox Code Playgroud)