[英]Instantiate a List inside of type initializer
说我有一个像这样的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);
这有可能吗? 我是否梦想着代码奢侈?
您可以这样做:
MyStruct s = new MyStruct()
{
StructConfig = "Some config details",
Details = new List<string>(someArray)
}
之所以List<T>
是因为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(),这将创建它的副本,您可以将其分配给struct属性,如下所示:
MyStruct s = new MyStruct()
{
StructConfig = "Some config details",
Details = someArray.ToList()
}
类似于以下内容:
s.Details = someArray.Select(detail=> detail.ToString()).ToList()
如果您的数组不是字符串[],将防止引发异常。 当然,您可能希望在这种情况下引发异常。
另外,值得考虑为什么要使用具有List属性的结构。 最好有一个类而不是一个结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.