实例化类型初始值设定项内部的List

本文关键字:内部 List 类型 实例化 | 更新日期: 2023-09-27 18:29:27

假设我有一个类似的struct

public struct MyStruct
{
     string StructConfig { get; set; }
     List<string> Details { get; set; }
     public MyStruct
     {
         Details = new List<string>();
     }
}

我用实例化这个struct

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details"
}

我想知道如何添加一个foreach循环,将详细信息添加到Details属性中,而不是:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details"
}
s.Details = new List<string>();
foreach (var detail in someArray)
    s.Details.Add(detail);

这可能吗?我是不是梦想着代码奢侈?

实例化类型初始值设定项内部的List

你可以这样做:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details",
    Details = new List<string>(someArray)
}

这是因为List<T>支持通过此构造函数从IEnumerable<T>进行初始化。

如果需要对someArray的元素进行额外的准备,可以使用LINQ并添加一个Select。以下示例在每个元素周围添加单引号:

Details = new List<string>(someArray.Select(s => string.Format("'{0}'", s)))

怎么样?

s.Details = new List<string>(someArray);

假设您不想从数组初始化列表,但确实希望能够直接在初始化器中写入列表元素,则可以使用集合初始化器:

var myStruct = new MyStruct() {
  StructConfig = "Some config details",
  Details = new List<string>() { "a", "b", "c" }
};

现在,有一个包含字符串和字符串列表的结构看起来有点奇怪,但这并不影响如何回答这个问题

可以执行类似的操作

MyStruct s = new MyStruct
{
    StructConfig = "Some config details",
    Details = someArray.ToList()
};

您可以在"someArray"集合上调用扩展方法ToList(),它将创建一个可以分配给结构属性的副本,如下所示:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details",
    Details = someArray.ToList()
}

类似的东西

s.Details = someArray.Select(detail=> detail.ToString()).ToList()

如果您的数组不是字符串[],将防止引发异常。当然,您可能希望在这种情况下抛出异常。

此外,值得考虑的是,为什么要使用具有List属性的结构;最好有一个类而不是一个结构。