簡體   English   中英

在類型初始值設定項中實例化一個List

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM