我有一个IGroup类型的对象列表.这些可以嵌套到umlimited级别,我试图在从数据库中检索它们之后对它们进行分组.我无法理解如何递归地将所有组添加到正确的父母.任何以null作为父级的组都是顶级组.我不能保证他们从数据库中出来的顺序.
public interface IGroup {
string ID { get; set; }
string Name { get; set; }
string ParentID { get; set; }
IList<IGroup> Groups { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
所以,如果我有一个列表:
Group1: ID = g1, ParentID = null
Group1a: ID = g2, ParentID = g1
Group2: ID = g3, ParentID = null
Group1b: ID = g4, ParentID = g3
Group1bc: ID = g5, ParentID = g4
Run Code Online (Sandbox Code Playgroud)
我正在尝试将它们分组为:
|Group1
|--Group1a
|--Group1b
|--|
|--Group1bc
|Group2
Run Code Online (Sandbox Code Playgroud)
有人想要递归分组吗?
不需要递归.以机智:
var lookup = items.ToDictionary(g => g.ID); // items is IEnumerable<IGroup>
foreach (var item in items.Where(g => g.ParentID != null)) {
lookup[item.ParentID].Groups.Add(item);
}
var parents = items.Where(g => g.ParentID == null);
Run Code Online (Sandbox Code Playgroud)
注意lookup[item.ParentID]如果没有IGroup相应的则会抛出ParentID.你可以更优雅地处理这个问题TryGetValue.
我的实施IGroup:
public class Group : IGroup {
public string ID { get; set; }
public string Name { get; set; }
public string ParentID { get; set; }
public IList<IGroup> Groups { get; set; }
public Group() {
Groups = new List<IGroup>();
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试项目:
IEnumerable<IGroup> items = new List<IGroup>() {
new Group() { ID = "g1", ParentID = null },
new Group() { ID = "g2", ParentID = "g1" },
new Group() { ID = "g3", ParentID = null },
new Group() { ID = "g4", ParentID = "g3" },
new Group() { ID = "g5", ParentID = "g4" },
new Group() { ID = "g6", ParentID = "g5" }
};
Run Code Online (Sandbox Code Playgroud)