c#将多个列表<派生类>的元素组装到唯一列表<基类>的最佳方法

问题描述

我正在尝试制作具有多个列表的数据容器类, 我想让提供的属性将这些列表的元素收集到一个列表中

我应该像下面那样编写 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,但它确实有细微差别