-1

winform とコンソールの両方で使用できるメソッドを作成しようとしています。

これが私のコードです:

  public class BeerKoozie
    {
        public bool IsSinging = false;
        //Your classes aren't working because you didn't have a constructor method.
        public BeerKoozie()
        {
            for (int beerCount = 0; beerCount < 100; beerCount++)
            {
                beerCollection[beerCount] = new Beer();

                if (beerCount == 99)
                {
                    IsSinging = true;
                }
            }
        }




        //needs a collection representing one hundred beers.
        Beer[] beerCollection = new Beer[100];

        // needs a notion of a current beer
        public int CurrentBeer = 99;

        // needs a notion of going to the next beer.
        public string DrinkAbeerAndSingTheSong()
        {
            //BeerKoozie.bee
            //foreach (Beer value in beerCollection)
            //foreach (Beer value in beerCollection)
            do(Beer i in beerCollection)
            {
                beerCollection[CurrentBeer].IsFull = false;

                CurrentBeer--;



            } while (CurrentBeer > 0);

            return CurrentBeer.ToString() + "... beers on the wall";

        }

最後に印刷しようとするbeerCollection[CurrentBeer].ToString、メソッドの名前が印刷されます。では、ビジネス エンドとビューを分離したまま、配列全体を反復処理するプラットフォームに依存しないメソッドには、どのパターンを使用する必要がありますか? 特定のハンドリング文字列を使用して、コンソールまたは winform でのみ機能するメソッドを簡単に作成できます。 (私のコードは、メソッドをいじって壊したためコンパイルできず、以前の状態に戻すことができません。現在、完全に機能するコードも持っているため、問題を再現できません。)

4

1 に答える 1

2

これからどこから始めますか??!!!?? これがコンパイルできた可能性のあるリモートで考えられる方法はないと思います...私はステップスルーして、段階的に答えを積み上げていきます。

さて、あなたのループで、代わりにこれをしてください:

foreach(Beer i in beerCollection)
{
    i.IsFull = false;
} 

whileがなくなり(コレクションのforeach反復とは何の関係もありません)、公開されているインデックス/カウンターがなくなっていることに注意してください。

次に、コンストラクターのループ:

for (int i = 0; i < 100; i++)
{
    beerCollection[i] = new Beer();
}

IsSinging = true;

beerCountに変更i-これはセマンティック引数でiあり、ループインデクサーを参照する標準的な方法であり、入力するのがはるかに短く、長い説明的な名前は必要ありません。はループの外側に移動されていることに注意してくださいIsSinging。ループの最後に設定する必要があります。設定するときかどうかを確認するための条件ステートメントは必要ありません。

最後に、あなたの質問に答えるために:

WinFormとConsoleの両方で機能する配列を吐き出すためのメソッドを作成する方法は?

これは両方で機能します-配列は言語構造であり、設定したプロジェクト/実行可能ファイルのタイプに完全に依存しません。BeerKoozieは、これらのいずれかで使用できるクラスです。ソリューションに新しいクラスライブラリプロジェクトを追加し、BeerKoozieその新しいプロジェクトにクラスを追加するだけで、新しいクラスプロジェクトを参照する他のプロジェクト/アセンブリから呼び出すことができます。

複数回戻る方法はありますか?

いいえ、ありません。あなたは完全に混乱しています-行CurrentBeer.ToString() + "... beers on the wall";はループ内にある必要があります、そうでなければあなたがしていることは関数を呼び出し、コレクション全体を繰り返して一度だけ戻ることです。次のようなものを使用することをお勧めします(要求どおりにdo / whileループを使用しています)。

public string DrinkAbeerAndSingTheSong()  
{  
    CurrentBeer = beerCollection.Length - 1;  //take 1 off, remember the array index is zero based   
    //StringBuilder sb = new StringBuilder();
    do
    {
        beerCollection[CurrentBeer].IsFull = false;
        //sb.AddLine(CurrentBeer + "... beers on the wall");
        //Console.Writeline(CurrentBeer + "... beers on the wall");
        CurrentBeer--;
    } while (CurrentBeer > 0);

    return CurrentBeer + "... beers on the wall";
    //sb.AddLine(CurrentBeer + "... beers on the wall");  //don't forget the last line of the song
    //return sb.ToString();
}

これにより、達成しようとしていることに応じて、いくつかのオプションがあります。配列内のビールの数と状態を調整するためにメソッドを100回呼び出す必要はないため、ループ内ですべての作業を行う必要があります。アクションが発生したときに曲の各行を印刷するか、曲全体を返したいと思うので、両方を含めました。適切なコードのコメントを外して再生するだけです。

于 2013-02-16T07:56:29.987 に答える