【问题标题】:incrementing without for loop在没有 for 循环的情况下递增
【发布时间】:2017-04-10 15:00:06
【问题描述】:

我有以下代码,我想创建一些守门员对象,然后是一些后卫对象,然后是中场等等。 我的意图是在创建每个对象后让 i 整数递增,并使用 if 语句检查 i 的值并相应地分配玩家类型。

目前,我将所有对象作为守门员对象取回,这意味着 i 没有递增。有什么想法可以解决这个问题吗?

//create different types of player
int i = 0;


if (i < 2)
{
    i+=1;
    //create gk
    p = new Goalkeeper(fname, lname, saves, tackles, assists, goals, minutesplayed, fitness);
}
else if (i >= 2 && i < 9)
{
    i++;
    //create d
    p = new Defender(fname, lname, headerswon, tackles, assists, goals, minutesplayed, fitness);
}
else if (i >= 9 && i < 16)
{
    i++;
    //crete mf
    p = new Midfielder(fname, lname, passsuccessrate, tackles, assists, goals, minutesplayed, fitness);
}
else
{
    i++;
    //create striker
    p = new Striker(fname, lname, shotsontarget, tackles, assists, goals, minutesplayed, fitness);
}

return p; //return the randomly generated player

【问题讨论】:

  • 这段代码只会创建一个对象(取决于 i 的值,它总是 0)然后返回那个对象。听起来你需要一个静态变量 i。
  • 你有没有围绕这些循环的任何外部循环。如果是,请确保您没有在其中每次都初始化 i = 0
  • 这看起来不像完整的代码。您在顶部将i 设置为0,因此只有第一个if 才会在您返回之前输入。
  • 好的,我看到问题是我将 i 初始化为 0,因此每次运行时将其设置为零。我有一个窗口加载方法,它运行此代码 20 次并用不同的播放器填充一个数组。那么在哪里初始化 i?
  • 您可能希望在方法外部声明i 并将其作为参数传入,或者代替调用该方法20 次调用它一次并将其更改为一次返回整个数组。

标签: c# oop for-loop if-statement


【解决方案1】:

你需要一个循环,否则整个if 分支结构只检查一次。

你为什么不喜欢循环?有了循环,就很简单了:

List<Player> players = new List<Player>();

for (int i = 0; i < numPlayers; ++i)
{
    Player p;

    if (i < 2)
        p = new GoalKeeper(...);
    else if (i < 9)
        p = new Defender(...);
    else if (i < 16)
        p = new Midfielder(...);
    else
        p = new Striker(...);

    players.Add(p);
}

【讨论】:

  • 我不反对循环。谢谢!
  • @GerMc ...但您的问题明确地说,“...没有 for 循环”
【解决方案2】:

让我静态

//创建不同类型的播放器

静态整数 i = 0;

            if (i < 2)
            {
            i+=1;
            //create gk
            p = new Goalkeeper(fname, lname, saves, tackles, assists, goals, minutesplayed, fitness);

        }
            else if (i >= 2 && i < 9)
            {
            i++;
            //create d
            p = new Defender(fname, lname, headerswon, tackles, assists, goals, minutesplayed, fitness);

            }
            else if (i >= 9 && i < 16)
            {
            i++;
            //crete mf
            p = new Midfielder(fname, lname, passsuccessrate, tackles, assists, goals, minutesplayed, fitness);

        }
            else
            {
            i++;
            //create striker
            p = new Striker(fname, lname, shotsontarget, tackles, assists, goals, minutesplayed, fitness);

        }



            return p; //return the randomly generated player

【讨论】:

  • @DonatPants 变量 i 不会在每次调用该方法时重新初始化,因为它现在是静态的
  • 对不起,我忘了补充,退货是我遇到问题的地方
【解决方案3】:

已解决:我从调用方法传递了一个 int 。谢谢大家!

private Player GetRandomPlayer(int count)
            {

                    Player p; //create new player

                //calculate various stats using random
                int tackles = rand.Next(0, 20);
                int assists = rand.Next(0, 3);
                int goals = rand.Next(0, 3);
                int  minutesplayed = rand.Next(0, 90);
                int saves = rand.Next(0,30);
                int headerswon = rand.Next(0, 20);
                int passsuccessrate = rand.Next(0, 100);
                int shotsontarget = rand.Next(0, 25);
                string fitness = "Fit";

                //create random player names from the names data declared earlier
                string fname = firstnames[rand.Next(0, firstnames.Length)];
                string lname = lastnames[rand.Next(0, lastnames.Length)];

                //2gk, 7d,7m,4 striker

                //create different types of player





                    if (count < 2)
                    {

                        //create gk
                        p = new Goalkeeper(fname, lname, saves, tackles, assists, goals, minutesplayed, fitness);

                    }
                    else if (count < 9)
                    {

                        //create d
                        p = new Defender(fname, lname, headerswon, tackles, assists, goals, minutesplayed, fitness);

                    }
                    else if (count < 16)
                    {

                        //crete mf
                        p = new Midfielder(fname, lname, passsuccessrate, tackles, assists, goals, minutesplayed, fitness);

                    }
                    else
                    {

                        //create striker
                        p = new Striker(fname, lname, shotsontarget, tackles, assists, goals, minutesplayed, fitness);

                    }



                    return p; //return the randomly generated player





        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2021-11-18
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多