2013-01-14 92 views
2

我想創建一個包含其中的「項目」列表的類。我已經成功完成了,但是我想創建項目列表中的項目列表。我也能夠做到這一點,但是我不得不爲項目中的班級使用不同的名稱。遞歸的C#類

我想使用相同的類名,因爲這將用於生成一些類名稱很重要的json。此外,我希望能夠以可像文件夾結構一樣遞歸的方式進行此操作。所有的屬性都是相同的。我希望我解釋得很好。我基本上試圖創建一個文件夾/文件結構,其中每個文件夾中可以有x個文件夾,也可以包含x個文件夾等等。

例如:

DocLib

-Item

--Item.Items

--- 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; } 
     } 
    } 
} 

我相信有可能是實現這個的更好的方法。

回答

5

只要讓項目成爲「自己的」型

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)); 

    } 
} 
+2

或有項目類包含一個列表財產 –

+0

@ChrisDoggett是的,這正是我與代表AWS對象的集合類來完成的。然後可以實例化該類來表示對象的單個實例或這些對象的集合。 –

+0

如果你這樣做,你可能想給這個類型一個不同的名字,因爲'DocLib'不能描述它的功能。 – Servy

0

你也可以使用泛型做到這一點。

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); 
+0

我試圖實現您的結構,但在將新項添加到.lib.Items集合時遇到問題。項目不可分配到列表>中鍵入DocLib 。 – ElHaix

+0

@ElHaix你是......我修正了代碼中的一些錯誤。首先,lib.Items中的每個元素應該是'DocLib' <'Item'>,它包含一個'Item',而不僅僅是'Item'的集合。 –

+0

我開始工作,但完成了一點不同。我創建了一個'公共接口IItem'列表 Items {get;組; }'有一些基本屬性。然後我創建了繼承'IItem'的其他項目類。所以'Items'可以存儲在它們自己內部。 – ElHaix