在C#中将两个列表对象连接在一起

时间:2017-02-19 13:37:54

标签: c# list

基本上,我正在编写一个扑克应用程序,我有一个名为Deck的类,它实际上只是List<>包含类Card的对象。它实际上只是一张卡片列表。

我现在正试图将其中两个Decks连接在一起:playerCardstableCards。但是,当我编写此代码时,我收到一条错误消息:

playerCards.Concat(tableCards);

它告诉我“'Deck'不包含'Concat'的定义,也没有扩展方法'Concat'接受第一个'Deck'类型的参数。”

如何将这两个列表对象连接在一起?

希望这能更好地解释甲板......

public class Deck
{

    public Deck()
    {
        deck = new List<Card>();
    }

    public List<Card> deck { get; }

2 个答案:

答案 0 :(得分:3)

Concat方法是Enumerable中定义的扩展方法:

IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);

这意味着您可以像这样使用它:

IEnumerable<Card> deck1 = new List<Card>();
IEnumerable<Card> deck2 = new List<Card>();
IEnumerable<Card> deck3 = deck1.Concat(deck2);

它将返回一个新的Card-objects序列。

方法AddRange是为fx List<T>

定义的
public void AddRange(IEnumerable<T> collection)

像这样使用:

List<Card> deck1 = new List<Card>();
List<Card> deck2 = new List<Card>();
deck2.AddRange(deck1);

这将通过添加来自deck2的元素来修改列表deck1。

因此,您选择如何在班级Concat中实施AddRangeDeck取决于您希望它拥有的行为:

  • Deck s
  • 返回包含新卡片Deck
  • 通过添加其他Deck
  • 的卡片来修改Deck

也许您可以使用以下内容作为灵感:

public class Deck
{
    private List<Card> cards;

    public IReadOnlyList<Card> Cards
    {
        get
        {
            return cards.AsReadOnly();
        }
    }

    public Deck()
    {
        cards = new List<Card>();
    }

    public Deck(IEnumerable<Card> cards)
    {
        cards = cards.ToList();
    }

    public Deck Concat(Deck other)
    {
        return new Deck(Cards.Concat(other.Cards));
    }

    public void AddRange(Deck other)
    {
        cards.AddRange(other.Cards);
    }
}

答案 1 :(得分:1)

public void Concat(Deck other)
{
   this.deck.AddRange(other.deck);
}

喜欢这个。 List.AddRange