问题描述
我正在尝试制作具有多个列表的数据容器类, 我想让提供的属性将这些列表的元素收集到一个列表中
我应该像下面那样编写 GatherAllCards() 代码还是有什么好的方法来压缩代码。
名为card*的类是Card
的派生类public class CardContainer : MonoSingleon<CardContainer>
{
[Serializefield]
private List<CardUnit> cardUnits;
[Serializefield]
private List<CardplayerUnit> cardplayerUnits;
[Serializefield]
private List<CardConsumable> cardConsumables;
[Serializefield]
private List<CardWeapon> cardWeapons;
[Serializefield]
private List<Card> cardBases;
public IReadOnlyList<Card> AllCard
{
private set;
get;
}
private void GatherAllCards()
{
List<Card> cardList = new List<Card>(500);
foreach (var card in cardUnits)
cardList.Add(card);
foreach (var card in cardplayerUnits)
cardList.Add(card);
foreach (var card in cardConsumables)
cardList.Add(card);
foreach (var card in cardWeapons)
cardList.Add(card);
foreach (var card in cardBases)
cardList.Add(card);
AllCard = cardList.AsReadOnly();
}
}
解决方法
使用 AddRange
,它需要一个 IEnumerable<Card>
。 IEnumerable<T>
是 covariant,所以传递一个 List<SpecificTypeOfCard>
就可以了。
cardList.AddRange(cardUnits);
cardList.AddRange(cardPlayerUnits);
cardList.AddRange(cardConsumables);
cardList.AddRange(cardWeapons);
cardList.AddRange(cardBases);
,
或者另一种方式是Concat
,您只需要先投射到Card
连接两个序列。
AllCard = cardUnits
.Cast<Card>()
.Concat(cardPlayerUnits)
.Concat(cardConsumables)
.Concat(cardWeapons)
.Concat(cardBases)
.ToList();
或
AllCard = new List<Card>()
.Concat(cardUnits)
.Concat(cardPlayerUnits)
.Concat(cardConsumables)
.Concat(cardWeapons)
.Concat(cardBases)
.ToList();
您也可以使用 Union
,但它确实有细微差别