.net 在C#中向列表添加或AddRange初始化对象

mwkjh3gx  于 2023-03-13  发布在  .NET
关注(0)|答案(3)|浏览(177)

https://learn.microsoft.com/de-de/visualstudio/code-quality/ca2227?view=vs-2019中所述,我有一个只读列表对象,如下所示:

public class MyClass {
  public int id { get; set; }
  public List<string> stringList { get; } = new List<string>;
}

但是如何通过向stringList添加数据来初始化MyClass呢?

MyClass test = new MyClass(){
  id = 1,
  stringList = ???
}
8fsztsew

8fsztsew1#

您可以使用不太明显的语法来处理集合初始值设定项:

var x = new MyClass
{
    id = 1,
    stringList = {"as", "ddsd"} // will ADD "as", "ddsd" to stringList 
};
Console.WriteLine(string.Join(", ", x.stringList)); // prints as, ddsd

但是处理只读属性的常用方法(直到C#9发布init only properties and records)是在构造函数中传递初始化值。

rqmkfv5c

rqmkfv5c2#

您可以将stringList作为构造函数中的参数传递,并将属性赋给该参数:

public class MyClass {
    public int id { get; set; }
    public List<string> stringList { get; } = new List<string>();

    public MyClass(List<string> stringList) {
        this.stringList = stringList;
    }
}
kulphzqa

kulphzqa3#

如果您想向列表中添加一个或多个元素,可以使用@GuruStron提出的解决方案。

var x = new MyClass
{
    id = 1,
    stringList = {"as", "ddsd"}
};

但是,如果你想添加一个集合,这就不起作用了。

var collection = new[] {"as", "ddsd"};

var x = new MyClass
{
    id = 1,
    stringList = { collection } // compile error!
};

但是你可以创建你自己定制的C#集合初始化器,创建一个扩展方法Add

public static TCollection Add<TCollection, TItem>(
    this TCollection destination,
    IEnumerable<TItem> source)
    where TCollection : ICollection<TItem>
{
    ArgumentNullException.ThrowIfNull(destination);
    ArgumentNullException.ThrowIfNull(source);

    if (destination is List<TItem> list)
    {
        list.AddRange(source);
        return destination;
    }

    foreach (var item in source)
    {
        destination.Add(item);
    }

    return destination;
}

现在编译上一个示例:

var collection = new[] {"as", "ddsd"}

var x = new MyClass
{
    id = 1,
    stringList = { collection }
};

我建议将扩展方法放在System.Collections.Generic名称空间下,这样它将自动导入,而无需手动添加所需的using

相关问题