C#多级对象和列表访问

Yao*_*hen 2 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; }
Run Code Online (Sandbox Code Playgroud)

当我想插入一个LineText = "Test"Page1,我需要做到以下几点.

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

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

Message.Pages[0].Lines[0].Text = "Test";
Run Code Online (Sandbox Code Playgroud)

谢谢.

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

Mar*_*ell 8

var msg = new Message {
    Pages = new List<Page> {
        new Page {
            Lines = new List<Line> { new Line { Text = "Test" } }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

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

var msg = new Message {
    Pages = {
        new Page {
            Lines = { new Line { Text = "Test" } }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

你也可以从添加的隐式转换操作符stringLine,在这种情况下:

var msg = new Message {
    Pages = {
        new Page {
            Lines = { "Test" }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

编辑:完整的工作示例,包括操作符和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"
                    },
                }
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)