比赛结果平局,如何在基座上列出两个名字?

时间:2018-02-14 22:40:51

标签: c# visual-studio if-statement

我正在使用visual studio C#创建一个比赛结果表单,然后在一个基座上显示获胜者,以便获得第一,第二和第三名。我的代码当前设置为在出现平局时显示错误消息。我想更改它,以便代替错误消息,将名称添加到相应的基座,以便允许绑定。

这是我和#34; tie"的代码。部分。

// if the runners have a tie
            if (time1 == time2 || time2 == time3 || time3 == time1)
            {
                // show error message
                MessageBox.Show("It's a tie! Let's race again to find the real winner!");
                trophyGroupBox.Visible = false;
                timeBox1.Text = "";
                timeBox2.Text = "";
                timeBox3.Text = "";
                firstPlaceLabel.Text = "";
                secondPlaceLabel.Text = "";
                thirdPlaceLabel.Text = "";
                timeBox1.Focus();
                return;
            }

我的其他代码中没有出现平局且名称列为正常的部分是......

  // if runner1 is faster than runner2
                if (time1 < time2)
                {
                    // display second and third place winners
                    secondPlaceLabel.Text = runner1;
                    silverTrophy.Text = runner1;
                    thirdPlaceLabel.Text = runner2;
                    bronzeTrophy.Text = runner2;
                }
                else
                {
                    // display second and third place winners
                    secondPlaceLabel.Text = runner2;
                    silverTrophy.Text = runner2;
                    thirdPlaceLabel.Text = runner1;
                    bronzeTrophy.Text = runner1;
                }

这就是没有领带的样子(带领带我只是想将跑步者的名字加到相应的基座作为第二名。

Race Results

2 个答案:

答案 0 :(得分:3)

如果您将每个赛车手的数据分组到一个班级而不是拥有单独的变量,并且只是&#34;知道&#34;这将变得更容易一些。 time1runner1等一起使用

也许是这样的:

public class Runner
{
    public Runner(string runner, TimeSpan time)
    {
        Runner = runner;
        Time = time;
    }
    public string Name { get; }
    public TimeSpan Time { get; }
}

然后,您可以将它们放在一个列表中,而不是使用三个单独的变量:

var runners = new List<Runner>();

否则,如果你想增加更多的跑步者,这会有多复杂?

如果您没有阅读过这里的任何内容,只需将数据放入某种结构中,就可以让您的生活变得更轻松。

现在您的数据更易于管理,因此查询起来很容易。例如,假设您希望让比赛中的所有参赛者从最快到最慢:

var orderedBySpeed = results.OrderBy(r => r.Time);

或者您只想要前三名:

var orderedBySpeed = results.OrderBy(r => r.Time).Take(3);

但根据你的问题,你也想考虑可能的关系。这意味着每个可能的位置(第1,第2,第3)可能有不止一个跑步者。为此,您可以使用GroupBy

var winnerGroups = runners.OrderBy(r => r.Time)
    .Take(3)
    .GroupBy(r => r.Time)
    .OrderBy(g => g.Key); // this last sort may be redundant.

我们选择最快的三个并根据他们的时间对它们进行分组。

现在winnerGroups是一组群组的参赛者。每个小组都有一个&#34; key&#34;,这就是他们的共同点。关键是Time。因此,具有相同Time的跑步者属于同一组。在大多数情况下,没有两个跑步者会有相同的时间,所以你将有三个小组,每个小组有一个跑步者。但如果两个人并列第一或第二,那么该组将包含两个参赛者。

这些方法都使用LINQ来查询集合。如果您还没有使用太多,那么一个又一个LINQ示例可能会有点疲惫。但是还有一个。

假设这些是比赛的结果,所以鲍勃和约翰并列:

鲍勃 - 凌晨1点 约翰 - 凌晨1点 史蒂夫 - 1:05

此查询:

var winnerNames = winnerGroups
    .Select(g => string.Join(" / ", g.Select(w => w.Name)));

将返回包含<{p}}的IEnumerable<string>

Bob / John
Steve

答案 1 :(得分:0)

如果以这种方式实现,看起来你会有很多if-else条件。像这样:

        if (time1 == time2)
        {
            if (time3 < time1)
            {
              timeBox1.Text = time1;
              timeBox2.Text = time2;
              timeBox3.Text = time3;
              firstPlaceLabel.Text = runner1+" and "+ runner2;
              secondPlaceLabel.Text = runner3;
              thirdPlaceLabel.Text = "";
              timeBox1.Focus();
              return;
            }
            else if (time3 > time1)
            {
              timeBox1.Text = time3;
              timeBox2.Text = time2;
              timeBox3.Text = time1;
              firstPlaceLabel.Text = runner3;
              secondPlaceLabel.Text = runner1+" and "+ runner2;
              thirdPlaceLabel.Text = "";
              timeBox1.Focus();
              return;
            }
            else
            {
              timeBox1.Text = time3;
              timeBox2.Text = time2;
              timeBox3.Text = time1;
              firstPlaceLabel.Text = runner1+" and "+ runner2+ " and "+ runner3;
              secondPlaceLabel.Text = "";
              thirdPlaceLabel.Text = "";
              timeBox1.Focus();
              return;
            }

        }
        else if (time2 == time3)
        {
            You get the idea
        }

从长远来看,您需要重构代码,这样您就不必像这样重复代码。遵循DRY原则:)