2012-03-29 70 views
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); 

这甚至可能吗?我在做梦幻代码奢侈品吗?

回答

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))) 
+0

2秒钟打我; p(愚蠢的验证码出现了......) – leppie 2012-03-29 11:19:20

+0

我认为你需要删除';',因为这会给你一个提示。 – 2012-03-29 11:23:17

+0

@NeilKnight你是对的!我删除了两个分号,谢谢! – dasblinkenlight 2012-03-29 12:43:22

1

怎么样?

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

可以做这样的事情

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

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

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

现在,其包含字符串和字符串列表的结构看起来稍显怪异,但这并不影响如何answe这个问题。

0

你可以调用扩展方法ToList()在“的someArray”收集,这将创建一个副本,你可以分配给你的结构特性,例如:

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

沿东西如下行:

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

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

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