微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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,但它确实有细微差别

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。