---
tags: c#, collection, list, initializers
---
# Collection initializers (集合初始化器)
這是一個在 c# 3引入的語法,使用於 List初始化時立即加入物件。
Example :
```csharp=
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<Cat> moreCats = new List<Cat>
{
new Cat{ Name = "Furrytail", Age=5 },
new Cat{ Name = "Peaches", Age=4 },
null
};
```
如果需要再 POCO( A Plain Old CLR/C# Object is a POCO)中加入 collection initialuzers,則必須在物件中加入一個 Add()方法。
Example :
```csharp=
public class PokerHands : IEnumerable<Card>
{
private IEnumerable<Card> _cards;
public PokerHands(IEnumerable<Card> cards)
{
_cards = cards;
}
public PokerHands()
{
_cards = new List<Card>();
}
public IEnumerator<Card> GetEnumerator()
{
return _cards.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(Card card)
{
var newCards = _cards.ToList();
newCards.Add(card);
_cards = newCards;
}
}
var pokerHands = new PokerHands
{
new()
{
Value = "2C"
},
new()
{
Value = "3H"
},
new()
{
Value = "4S"
},
new()
{
Value = "8C"
},
new()
{
Value = "AH"
}
};
```
如果今天要在一個沒有權限修改的物件加入初始化器,可以使用擴充方法去騙過 Compile。
Example :
```csharp=
public class PokerHands : IEnumerable<Card>
{
private IEnumerable<Card> _cards;
public PokerHands(IEnumerable<Card> cards)
{
_cards = cards;
}
public PokerHands()
{
_cards = new List<Card>();
}
public IEnumerator<Card> GetEnumerator()
{
return _cards.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Insert(Card card)
{
var newCards = _cards.ToList();
newCards.Add(card);
_cards = newCards;
}
}
public static class PokerHandsExtensions
{
public static PokerHands Add(this PokerHands pokerHands, Card card)
{
pokerHands.Insert(card);
return pokerHands;
}
}
var pokerHands = new PokerHands
{
new()
{
Value = "2C"
},
new()
{
Value = "3H"
},
new()
{
Value = "4S"
},
new()
{
Value = "8C"
},
new()
{
Value = "AH"
}
};
```
除了 List之外,Dictionary也可以用類似的方法去實現初始化器功能,可參考 MSDN。
## Reference
[Object and Collection Initializers (C# Programming Guide)](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers)