我正在使用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;
}
这就是没有领带的样子(带领带我只是想将跑步者的名字加到相应的基座作为第二名。
答案 0 :(得分:3)
如果您将每个赛车手的数据分组到一个班级而不是拥有单独的变量,并且只是&#34;知道&#34;这将变得更容易一些。 time1
与runner1
等一起使用
也许是这样的:
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原则:)