在c#上实现树结构

时间:2013-12-22 15:05:51

标签: c# design-patterns

我有一个对象myBook。

我可以为这种数据实现更好的结构吗?

public class myRow{

    public int ID = 0;
    public int number = 0;
    public String param1 = null;
    public decimal param2 = null;
    public string parm3 = "";
    public int param4 = null;

}

public class mySubChapter{

   public int ID = 0;
   public string title = "";   
   public List<myRow> rows;

   internal bool sort(){...}  //sort rows by ID
}

public class myChapter{

   public int ID = 0;
   public string title = "";
   public List<mySubChapter> subChapters;

   internal bool sort(){...}  //sort subChapters by ID
}

public class myBook{
    public int ID = 0;
    public string title = ""
    public List<myChapter> chapters;

     internal bool sort(){...}  //sort chapters by ID
}

3 个答案:

答案 0 :(得分:2)

如果您真的想在树中对书籍结构进行建模,则可以使用通用树实现,例如here。然后,您可以使用像这样的代码构建树

DTreeNode<string> root = new DTreeNode<string>();
DTreeNode<string> temp;

temp = root.Nodes.Add("Hello");
temp.Nodes.Add("olleH");

temp = root.Nodes.Add("World");
temp.Nodes.AddRange(new string[] 
        { "dWorl", "ldWor", "rldWo", "orldW" } );

答案 1 :(得分:0)

在我看来,我将subchapter和chapper类合并到一个myChaper类中,并在其中添加新属性是chapterLevel。因为我认为subChapter也是一个章节,只是差异级别(章节的孩子可能是)。抱歉我的英文。

public class myRow{

    public int ID = 0;
    public int number = 0;
    public String param1 = null;
    public decimal param2 = null;
    public string parm3 = "";
    public int param4 = null;

}

public class myChapter{

   public int ID = 0;
   public string title = "";
   public int chapterLevel = 0;

   internal bool sort(){...}  //sort chapters by ID and level
}

public class myBook{
    public int ID = 0;
    public string title = ""
    public List<myChapter> chapters;

     internal bool sort(){...}  //sort chapters by ID
}

答案 2 :(得分:0)

另一个树实现:

public interface INode
{
    int Id { get; set; }

    INode Parent { get; }

    ReadOnlyCollection<INode> Children { get; }

    void SetParent(INode node);

    void AddChild(INode node);
}

public class Node : INode
{
    private INode _parent;

    private IList<INode> _children;

    public Node()
    {
        _children = new List<INode>();    
    }

    public int Id { get; set; }

    public INode Parent
    {
        get { return _parent; }
    }

    public ReadOnlyCollection<INode> Children
    {
        get
        {
            return new ReadOnlyCollection<INode>
                       (_children.OrderBy(c => c.Id).ToList());
        }
    }

    public virtual void AddNode(INode node)
    {
        _children.Add(node);

        node.SetParent(this);
    }

    public virtual void SetParent(INode node)
    {
        _parent = node;
    }
}

类,Row,Chapter,Book可以从Node类派生,例如

public class Book : Node
{
    public override void SetParent(INode node)
    {
        throw new InvalidOperationException();
    }

    public string Title { get; set; }
}