2

说我有一个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);

这甚至可能吗?我梦想着代码奢华吗?

4

6 回答 6

2

你可以这样做:

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

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

如果需要someArraySelect. 下面的示例在每个元素周围添加单引号:

Details = new List<string>(someArray.Select(s => string.Format("'{0}'", s)))
于 2012-03-29T11:18:19.983 回答
1

怎么样?

s.Details = new List<string>(someArray);
于 2012-03-29T11:18:21.707 回答
1

假设您不想从数组初始化列表,但真的希望能够直接在初始化程序中写入列表元素,您可以使用集合初始化程序

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

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

于 2012-03-29T11:20:23.840 回答
0

可以做这样的事情

MyStruct s = new MyStruct
{
    StructConfig = "Some config details",
    Details = someArray.ToList()
};
于 2012-03-29T11:20:14.953 回答
0

您可以在“someArray”集合上调用扩展方法 ToList(),这将创建它的副本,您可以将其分配给 struct 属性,如下所示:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details",
    Details = someArray.ToList()
}
于 2012-03-29T11:20:38.633 回答
0

类似于以下内容:

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

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

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

于 2012-03-29T11:23:37.260 回答