手动填写C#数据类型集合列表

时间:2018-07-15 19:59:55

标签: c# list properties

我正在研究一个C#示例,以学习列表以及如何初始化它们。所以我有一个带有一些属性的类:

public class C1
{
    public string p1 { get; set; }
    public string p2 { get; set; }
    public List<StatusChoices> ChoiceList { get; set; }

    ...

    public string FillList(string v1, int v2, bool v3)
    {
        // How can I fill this.ChoiceList?

        this.ChoiceList.val1 = v1; //Is this possible?

        return this.ChoiceList.val1;
    }
}

public class StatusChoices
{
    public string val1 { get; set; }
    public int val2    { get; set; }
    public bool val3   { get; set; }
}

这可能很容易,但是到目前为止我还无法实现。如何在列表中“ 手动”添加一些值?

3 个答案:

答案 0 :(得分:3)

创建类ChoiceList时,null被初始化为C1。 (实际上,每个类字段(包括隐藏的属性支持字段)都被初始化为其默认值。)您必须显式创建列表对象。

您可以在类构造函数中这样做

public class C1
{
    ...
    public List<StatusChoices> ChoiceList { get; set; }

    public C1() // Constructor. Is run when a new C1 object is created with `new`.
    {
        ChoiceList = new List<StatusChoices>();
    }

    ...
}

创建后,此列表为空。您必须向其中添加元素:

public string FillList(string v1, int v2, bool v3){
    ChoiceList.Add(new StatusChoices{ val1 = v1, val2 = v2, val3 = v3 });
    return v1;
}

请注意,您还必须创建一个StatusChoices对象。您可以将类视为可用于创建对象的模板。

将对象添加到列表后,可以通过枚举访问它们

foreach (StatusChoices sc in ChoiceList) {
    Console.WriteLine($"val 1 = {sc.val1}, val 2 = {sc.val2}, val 3 = {sc.val3}")
}

或通过索引

StatusChoices first = ChoiceList[0];
StatusChoices second = ChoiceList[1];
string v1_of_first  = first.val1;
string v1_of_second  = second.val1;

您还可以直接访问元素的属性

string v1_of_first  = ChoiceList[0].val1;
string v1_of_second  = ChoiceList[1].val1;

如果您有对象C1 c1 = new C1();,则可以编写

string v = c1.ChoiceList[0].val1;

您甚至可以构造C1个对象的列表

var mainList = new List<C1>(); // The var-keyword lets C# infer the type.
                               // This saves you from writing List<C1> again.
mainList.Add(new C1());
mainList.Add(new C1());
mainList.Add(new C1());
mainList[0].FillList("a", 12, true);
mainList[0].FillList("b", 33, false);
mainList[1].FillList("x", 77, true);
...
string v = mainList[1].ChoiceList[2].val1;

我使用ChoiceList.Add(new StatusChoices{ val1 = v1, val2 = v2, val3 = v3 });向列表添加了新元素。这是

的简短版本
StatusChoices sc = new StatusChoices();
sc.val1 = v1;
sc.val2 = v2;
sc.val3 = v3;
ChoiceList.Add(sc);

简短版本使用对象初始化程序{ val1 = v1, ... }

答案 1 :(得分:2)

类似这样的东西

public string FillList(string v1, int v2, bool v3){
    this.ChoiceList = new List<StatusChoices> {
     new StatusChoices { val1 = v1, val2 = v2, val3 = v3, } };
    return this.ChoiceList[0].val1;
}

答案 2 :(得分:1)

只需创建StatusChoices类的实例,对其进行初始化并将其添加到列表中。

(我添加了列表的惰性初始化)

public class C1{
    public string p1 {get; set; }
    public string p2 {get; set; }
    public List<StatusChoices> ChoiceList { get; set; }
    ...
    public string FillList(string v1, int v2, bool v3){

        if(ChoiceList == null)
        {
            this.ChoiceList = new List<StatusChoices>();
        }

        var newItem = new StatusChoices {val1 = v1, val2 = v2, val3 = v3};
        this.ChoiceList.Add(newItem);

        return newItem.val1;
    }
}