2012-03-29 73 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的結構體;有一個類而不是一個結構可能會更好。