C# Class with recursion

本文关键字:recursion with Class | 更新日期: 2023-09-27 17:52:54

我试图创建一个包含"项目"列表的类。我已经成功地做到了,然而,然后我想在项目列表中创建一个项目列表。我也能够做到这一点,但是我必须为项目中的类使用不同的名称。

我想使用相同的类名,因为这将用于生成一些json,其中类名是重要的。另外,我还想让它像文件夹结构一样递归。所有的属性都是一样的。我希望我解释得够清楚了。我实际上是在尝试创建一个文件夹/文件结构,其中每个文件夹中可以有x个文件,每个文件夹中也可以有x个文件夹,以此类推。

例如

:

DocLib

项目

——项目。项目

——Item.Items.Items

——项目。项目

-Item 2等…

下面是现有代码:

public class DocLib
{
    public string Title { get; set; }
    public string spriteCssClass { get { return "rootfolder"; } }
    public List<item> items { get; set; }
    public DocLib()
    {
        items = new List<item>();
    }
    public class item
    {
        public string Title { get; set; }
        public string spriteCssClass { get; set; }
        public List<document> documents { get; set; }
        public item()
        {
            documents = new List<document>();
        }
        public class document
        {
            public string Title { get; set; }
            public string spriteCssClass { get; set; }
        }
    }
}

C# Class with recursion

让条目成为你"自己"类型的列表

public class DocLib{
   public string Title { get; set; }
   public string spriteCssClass { get { return "rootfolder"; } }
   List<DocLib> _items;
   public DocLib(){
      _items = new List<DocLib>();
   }
   public List<DocLib> Items { 
      get{
         return _items;
      }
   }
}

编辑用法示例:

public static class DocLibExtensions {
    public static void Traverse(this DocLib lib,Action<DocLib> process) {
        foreach (var item in lib.Items) {
            process(item);
            item.Traverse(process);
        }
    }
}
class Program {
    static void Main(string[] args) {
        DocLib rootDoc = new DocLib {Title = "root"};
        rootDoc.Items.Add( new DocLib{ Title = "c1" });
        rootDoc.Items.Add(new DocLib { Title = "c2" });
        DocLib child = new DocLib {Title = "c3"};
        child.Items.Add(new DocLib {Title = "c3.1"});
        rootDoc.Items.Add(child);
        rootDoc.Traverse(i => Console.WriteLine(i.Title));
    }
}

您也可以使用泛型完成此操作。

public class DocLib<T>
{
   public T Item { get; set; }
   public IEnumerable<DocLib<T>> Items { get; set; }
}
public class Item
{
   public string Title { get; set; }
   public string spriteCssClass { get; set; }
}
//Usage
//Set up a root item, and some sub-items
var lib  = new DocLib<Item>();
lib.Item = new Item { Title="ABC", spriteCssClass="DEF" };
lib.Items = new List<DocLib<Item>> { 
  new DocLib<Item>{ Item = new Item {Title="ABC2", spriteCssClass="DEF2"} },
  new DocLib<Item>{ Item = new Item {Title="ABC3", spriteCssClass="DEF3"} }
};
//Get the values
var root = lib.Item;
var subItems = lib.Items.Select(i=>i.Item);