-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;

更改beerCounti- 这是一个语义参数,i是引用循环索引器的标准方式,并且键入要短得多,您不需要长的描述性名称。请注意IsSinging已移至循环外部 - 您只需在循环结束时设置它,您不需要条件语句来查看是否该设置它。

最后,回答你的问题:

如何编写一个吐出在 WinForm 和控制台中都有效的数组的方法?

这在两者中都有效 - 数组是一种语言结构,完全独立于您设置的项目/可执行文件类型。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 回答