Search code examples
c#unity-game-enginetypesdowncast

c# best way to assemble multiple list<derived class>s' elements to sole list<base class>


i'm trying to make data container class which has multiple list, i want to make property that offers gather these list's elements to one list

should i just code GatherAllCards() like below or are there any good way to compress the code.

classes named card* is derived class of 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();
    }
}

Solution

  • Use AddRange, which takes an IEnumerable<Card>. IEnumerable<T> is covariant, so passing it a List<SpecificTypeOfCard> is fine.

    cardList.AddRange(cardUnits);
    cardList.AddRange(cardPlayerUnits);
    cardList.AddRange(cardConsumables);
    cardList.AddRange(cardWeapons);
    cardList.AddRange(cardBases);