C# - 递归分组

Ech*_*lon 1 .net c# recursion

我有一个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)

有人想要递归分组吗?

jas*_*son 6

不需要递归.以机智:

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)