C#多级对象和列表访问

时间:2014-05-29 10:35:13

标签: c# oop

我不知道这个问题的标题是什么,也不知道要搜索的关键字。

方案: 我有一个模型如下

public class Message { public List<Page> Pages { get; set; }
public class Page { public List<Line> Lines { get; set; }
public class Line { public string Text {get; set; }

当我想在Line 1处插入Text = "Test" Page时,我需要执行以下操作。

var Message = new Message();
var line = new Line { Text = "Test" };
var page = new Page();
page.Lines.Add(line);
Message.Pages.Add(page);

问题:有没有更简单的方法来实现这一目标?例如

Message.Pages[0].Lines[0].Text = "Test";

感谢。

编辑:假设所有属性都在构造函数中正确实例化。

3 个答案:

答案 0 :(得分:8)

var msg = new Message {
    Pages = new List<Page> {
        new Page {
            Lines = new List<Line> { new Line { Text = "Test" } }
        }
    }
};

注意:如果列表在各自的构造函数中初始化,则可以删除new List<>位:

var msg = new Message {
    Pages = {
        new Page {
            Lines = { new Line { Text = "Test" } }
        }
    }
};

您还可以添加从stringLine的隐式转换运算符,在这种情况下:

var msg = new Message {
    Pages = {
        new Page {
            Lines = { "Test" }
        }
    }
};

编辑:完整的工作示例,包括操作符和ctor初始化,以及多个页面(请参阅注释):

using System.Collections.Generic;

public class Message {
    public List<Page> Pages { get; private set; }
    public Message() { Pages = new List<Page>(); }
}
public class Page {
    public List<Line> Lines { get; private set; }
    public Page() { Lines = new List<Line>(); }
}
public class Line {
    public string Text { get; private set; }
    public static implicit operator Line(string value) {
        return new Line { Text = value };
    }
}

static class Program {
    static void Main() {
        var msg = new Message {
            Pages = {
                new Page {
                    Lines = { "Test" }
                },
                new Page {
                    Lines = {
                        "On another page",
                        "With two lines"
                    },
                }
            }
        };
    }
}

答案 1 :(得分:1)

您可以在类中创建辅助方法,这将为构建消息和页面提供方便的API。首先是Message类 - 新的Add方法接受要添加的页面,并返回消息实例。这将允许使用流畅的API来添加页面(示例在底部):

public class Message
{
    public Message()
    {
        Pages = new List<Page>();
    }

    public List<Page> Pages { get; private set; }

    public Message Add(Page page)
    {
       Pages.Add(page);
       return this;
    }
}

和页面类。我添加了静态创建方法,它使用传递给此方法的任意行来构建页面:

public class Page 
{
    public Page() 
    {
        Lines = new List<Line>();
    }

    public List<Line> Lines { get; private set; }

    public static Page WithLines(params string[] texts)
    {
        var page = new Page();

        foreach(var text in texts)
           page.Lines.Add(new Line { Text = text });

        return page;
    }
}

然后添加带有行的页面将显示为

message.Add(Page.WithLines("Text1", "Text2"))
       .Add(Page.WithLines("Text3"));

答案 2 :(得分:0)

马克和谢尔盖说的话。您也可以考虑使用简化的构建器。我用字段替换了属性以使示例更小:

public class Message { public List<Page> Pages = new List<Page>(); }
public class Page { public List<Line> Lines = new List<Line>(); }
public class Line { public string Text; }

然后你的建造者看起来像这样:

public class Typewriter
{
    Message message = new Message();
    Page currentPage;

    public Typewriter NewPage()
    {
        currentPage = new Page();
        message.Pages.Add(currentPage);
        return this;
    }

    public Typewriter AddLine(string text)
    {
        currentPage.Lines.Add(new Line() { Text = text });
        return this;
    }
}

然后你可以这样做:

var typewriter = new Typewriter();
typewriter.NewPage().AddLine("First line on first page")
    .AddLine("Next line on first page")
    .NewPage().AddLine("Next page etc");