[英]C# multi level object and list access
我不知道這個問題的標題是什么,也不知道搜索的關鍵字。
場景 :我有一個模型如下
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; }
當我想在Page
1 Page
插入帶有Text = "Test"
的Line
時,我需要執行以下操作。
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";
謝謝。
編輯 :假設所有屬性都在構造函數中正確實例化。
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" } }
}
}
};
您還可以將一個隱式轉換運算符從string
添加到Line
,在這種情況下:
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"
},
}
}
};
}
}
您可以在類中創建輔助方法,這將為構建消息和頁面提供方便的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"));
馬克和謝爾蓋說的話。 您也可以考慮使用簡化的構建器。 我用字段替換了屬性以使示例更小:
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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.