0

こんにちは、私は現在課題を完了しようとしていますが、クラスの 1 つを完了するのに苦労しています。クラスが呼び出されhand.cs、次のようになります。

hand.cs がプルしている他の 2 つのデータ ソースは と ですcard.cstwentyOne.cs人々がコメントする前に、これが明らかな解決策であり、多くの読者にとってはばかげているように見えるかもしれませんが、私はこの hand.cs をよりよく調べてきました。 4日半、進展なし。

回答に問題がなければ、返品を完了するためのコードの概要を説明し、それがどの"public void DisplayHand(bool shortFormat, bool displaySuit)"ように機能するかについてフィードバックを提供していただければ幸いです。

4

1 に答える 1

1

あなたの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()DisplayHandToString()

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);
于 2012-10-16T05:17:14.107 に答える