簡體   English   中英

C#多級對象和列表訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM