如何遍历 IEnumerable<Card> Create Deck();并打印到控制台?

How can I loop through IEnumerble<Card> CreateDeck(); and print to the console?

所以我最近写了一个算法,我发布在堆栈 exchange/code 评论上,它很受欢迎,我得到了很多改进建议。我是 C# 的新手,我不太了解 IEnumerable 接口。

如何将我的整个牌组打印到控制台?

下面的代码是一个方法,如果我调用这个方法我就没办法了...或者我可以吗?

我被建议使用的方法之一是:

public IEnumerable<Card> CreateDeck()
{
  var deck = new List<Card>();

  foreach(var value in Enum.GetValues<CardValue>())
    foreach (var suit in Enum.GetValues<CardSuit>())
      deck.Add(new Card(value, suit));

  return deck;
}

我的卡片枚举

public enum CardValue {Ace, King, Queen, Jack, Ten, Nine, Eight, Seven, Six, Five, Four, Three, Two};
public enum CardSuit {Spades, Clubs, Hearts, Diamonds};

创建卡片

public struct Card
{
  public CardValue Value { get; }
  public CardSuit Suit { get; }

  public Card(CardValue value, CardSuit suit)
  {
    Value = value;
    Suit = suit;
  }

  public override string ToString()
  {
    return $"{Value} of {Suit}";
  }
}

只需使用一个简单的 foreach 循环:

foreach (var card in CreateDeck()) Console.WriteLine(card);

这使用 Console.WriteLine(object) 重载,它将在内部调用 Card 上定义的 ToString() 方法。


顺便说一句,您可以通过使用 yield return 而不是分配列表来减少 CreateDeck 方法中的内存使用量:

public IEnumerable<Card> CreateDeck()
{
    foreach (var value in Enum.GetValues<CardValue>())
    {
        foreach (var suit in Enum.GetValues<CardSuit>())
        {
            yield return new Card(value, suit);
        }
    }
}

这样,Card 会在您迭代时创建 on-demand,并在它们离开作用域后立即符合垃圾回收条件。

如果您发现需要列表,可以随时这样做:

var cards = CreateDeck().ToList();

在 CardDeck class 或任何 class 中实现 GetEnumerator 方法

    class Program
    {
        static void Main(string[] args)
        {
            var cd = new CardDeck();
            cd.cards = new List<Card>()
                {
                    new Card(CardValue.Ace, CardSuit.Spades),
                    new Card(CardValue.Five, CardSuit.Clubs)
                };

            foreach (var c in cd)
            {
                Console.WriteLine(c);
            }

        }
    }

以上是在look中如何使用的例子

OP代码


    public enum CardValue { Ace, King, Queen, Jack, Ten, Nine, Eight, Seven, Six, Five, Four, Three, Two };
    public enum CardSuit { Spades, Clubs, Hearts, Diamonds };

    public struct Card
    {
        public CardValue Value { get; }
        public CardSuit Suit { get; }

        public Card(CardValue value, CardSuit suit)
        {
            Value = value;
            Suit = suit;
        }

        public override string ToString()
        {
            return $"{Value} of {Suit}";
        }
    }

IEnumerable 实现


    class CardDeck
    {
        public List<Card> cards;

        public IEnumerator<Card> GetEnumerator()
        {
            foreach (var contact in cards)
                yield return contact;
        }
    }