C#动态对象列表

时间:2011-12-08 09:29:10

标签: c# asp.net asp.net-mvc-3

我有一个小实体“类别”

Id
Name 
Parent_id

我想用项目的所有父项的字符串覆盖ToString(),我不知道该项目有多少父母。

Example: (pseudo code)
Item1 =>  Id = 1, Name = Computers, Parent_id = null 
Item2 =>  Id = 2, Name = Laptops  , Parent_id = 1
Item3 =>  Id = 3, Name = Acer     , Parent_id = 2

在Item3.ToString()的输出上,我希望结果为"Computers > Laptops > Acer"。 我需要它是动态的,所以我不知道应该采取多少步骤... 任何新鲜的idéas?

3 个答案:

答案 0 :(得分:0)

你需要递归地执行此操作:

public overrides string ToString()
{
    string build = parent.ToString();
    if (!String.IsNullOrEmpty(build)) build += " > ";
    build += Name;
    return build
}

上面的内容应该这样做 - 每个实体将在其父级上调用ToString,以便获得层次结构中所有实体的列表。无论层次结构深入(在合理范围内),这都会有效。

注意:您需要引用父级来执行此操作,您可以使用属性,也可以使用已经获得的parentid属性查看实体。

答案 1 :(得分:0)

首先,您需要将父项本身(不仅仅是ID)添加到每个项目,然后通过简单的循环就可以轻松实现:

public override string ToString()
{
    List<string> names = new List<string>();
    names.Add(this.Name);
    Category parent = this.Parent;
    while (parent != null)
    {
        names.Add(parent.Name);
        parent = parent.Parent;
    }
    names.Reverse();
    return string.Join(" > ", names);
}

答案 2 :(得分:0)

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Category Parent { get; set; }

    public override string ToString()
    {
        return Parent == null 
            ? Name
            : string.Format("{0} > {1}", Parent, Name);
    }
}

用法:

item1 = new Category{Id = 1, Name = "Computers"};
item2 = new Category{Id = 2, Name = "Laptops", Parent = item1};
item3 = new Category{Id = 3, Name = "Acer", Parent = item2};

Debug.Print(item3.ToString());
Debug.Print(item2.ToString());
Debug.Print(item1.ToString());

结果:

Computers > Laptops > Acer
Computers > Laptops
Computers