【发布时间】:2015-02-01 04:00:31
【问题描述】:
我正在研究 C#,我正在寻找一种简单的方法来获取表示树的列表并将树扁平化为与树中顺序相同的列表。
每个节点有 4 个属性:
* 身份证
* 家长 ID,
* 序列
* 名称
public class MyNode
{
public int ID{get;set;}
public int ParentID{get;set;}
public int SeqID{get;set;}
public string Name{get;set;}
}
我有一个 MyNode 的集合:
List<MyNode> FlatListOfNodes{get;set;}
我正在寻找如下所示的内容:FlatListOfNodes.OrderBy(something).DoAnotherThing1(somthing)...。
这将按照与树中相同的顺序对列表进行排序。
例如,如果会有这棵树:
-- Parent1
-- Child 1.1
-- Child 1.2
-- grandson 1.2.1
-- grandson 1.2.2
-- grandson 1.2.3
-- Child 1.3
-- Parent2
-- Child 2.1
-- Child 2.2
-- grandson 2.2.1
-- grandson 2.2.2
-- grandson 2.2.3
-- Child 2.3
-- grandson 2.3.1
-- grandson 2.3.2
我想以相同的顺序在一个平面列表中表示它。
在这个例子中:
- Parent1 的 ID=32,ParentID=-1,SeqID=1,Name="Parent1"
- Child1.2 的 ID=412,ParentID=32,SeqID=2,Name="Child1.2"
- 孙子 1.2.1 的 ID=231,ParentID=412,SeqID=1,Name="grandson 1.2.1"
- Parent2 的 ID=345,ParentID=-1,SeqID=2,Name="Parent2"
- 具有 ID=785、ParentID=345、SeqID=3、Name="Child 2.3" 的 Child2.3
- 孙子 2.3.1 的 ID=854,ParentID=785,SeqID=1,Name=“孙子 2.3.1”
最好的方法是什么?
有没有办法用 linq 做到这一点?
谢谢!
【问题讨论】:
-
可以逆向遍历列表
-
我想你应该看看Enumerable.SelectMany
-
SelectMany 在这种情况下不能使用。它不是集合中的集合
-
我认为您正在寻找预购遍历,网上有很多参考资料。 (并且可以使用
SelectMany,但它比更直接的递归迭代器更难:这在没有 LINQ 的情况下更容易。) -
是否可以在 MyNode 中添加另一个字符串属性,可以设置为整体序列(1.2、2.3.1 等)。这可以通过将当前节点的序列连接到父节点的序列来完成。按此属性排序应给出您要查找的顺序。