在类型初始值设定项中实例化一个List

时间:2012-03-29 11:14:30

标签: c# typeinitializer

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

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

6 个答案:

答案 0 :(得分:2)

你可以这样做:

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

这是有效的,因为List<T>支持从IEnumerable<T>this constructor的初始化。

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

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

答案 1 :(得分:1)

怎么样?

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

可以做这样的事情

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

有些事情:

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

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

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