[英]Create a tree from a list in C#, with grouping
我有这个课:
class Foo
{
Category1 Cat1;
Category2 Cat2;
Category3 Cat3;
decimal Weight;
}
每个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
...
我想从列表中创建一棵树。 那是:
节点列表,作为此节点:
class Node
{
string Name;
decimal Weight;
List<Node> Children;
}
使用以下层次结构顺序: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)
问题:最优雅的方法是什么? 我正在使用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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.