あなたのHand
クラスでは、現在のハンドのカードをList<string>
適切な名前のに保存していますcards
。あなたのメソッドでは、ループDisplayHand
を使ってリストを反復処理できます。foreach
foreach (Card card in cards) {
// process and/or display current card
}
これで、Card
クラスで、ToString()
メソッドがオーバーロードされ、2つのパラメーターを受け入れるようになりました。
public string ToString(bool shortFormat, bool displaySuit)
これらの同じ2つのパラメーターは、クラスDisplayHand
内の関数に便利に渡されます。メソッドからCards
メソッドを呼び出したいので、受け取った引数を渡すだけで、カードを表す適切でフォーマットされた文字列が返されます。多くの作業をしなくても、上記のループをカードの呼び出しと組み合わせて、必要な出力を取得できるはずです。ToString()
DisplayHand
ToString()
public void DisplayHand(bool shortFormat, bool displaySuit) {
StringBuilder cardOutput = new StringBuilder();
foreach (Card card in cards) {
if (cardOutput.Length > 0) {
// we already have one or more cards to display for this hand; separate them
// with a space-delimiter
cardOutput.Append(" ");
}
// add the current card to the display
cardOutput.Append(card.ToString(shortFormat, displaySuit));
}
Console.WriteLine(cardOutput.ToString());
}
カード間の区切り文字として単一のスペースを使用しています。あなたはそれをあなたが適切だと思うものに更新することができます。また、カードの各リストを改行に表示したくない場合は、代わりにに変更しConsole.WriteLine()
てください。Console.Write()
*注:このStringBuilder
例では、2つの理由から、基本的な文字列連結の代わりに使用することを選択しました。1つ目は、C#では文字列が不変であるためです(文字列を連結することは、使用するよりもはるかに効率的ではありませんStringBuilder
)。2つ目は、使用方法を示すことですStringBuilder
(サンプルコードに含まれていないため、使用しないことを前提としています)。StringBuilder
(コメントなどを削除して)なしでそれを行うには:
string cardOutput = string.Empty;
foreach (Card card in cards) {
if (!cardOutput.Equals(string.Empty)) cardOutput += " ";
cardOutput += card.ToString(shortFormat, displaySuit);
}
Console.WriteLine(cardOutput);