如何遍历 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;
}
}
所以我最近写了一个算法,我发布在堆栈 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;
}
}