这是我正在使用的跑步速度/时间计算器。我遇到的这个特殊问题是找到输入的英里时间值的平均速度。我让用户通过文本框以hh:mm:ss格式输入多个值。我需要将这些值加在一起,找到输入值的平均值,然后将该平均值返回给hh:mm:ss格式的标签。我尝试了各种方法来执行此操作,并阅读了其他多篇文章,但一直陷于困境。
我尝试使用列表,但是输入的值的数量总是变化的,我需要它是动态的。如果有一种方法只能将用户定义的值输入列表,则我的列表将起作用。截至目前,即使其中一个没有值,它也会得到我所有盒子的平均值。
还尝试将TimeSpan值加在一起,然后将它们除以一个计数。这样可以得到用户输入了多少个值的正确计数。但是,我收到一条错误消息,说不能将/运算符应用于TimeSpan和int类型的操作数。
这与“查找TimeSpans集合的平均值”情况不同。那篇文章中使用的代码破坏了我的整个应用程序。
private void calculate_btn_Click(object sender, EventArgs e)
{
TimeSpan d1 = TimeSpan.Parse(textBox1.Text);
TimeSpan d2 = TimeSpan.Parse(textBox2.Text);
TimeSpan d3 = TimeSpan.Parse(textBox3.Text);
TimeSpan total = (d1 + d2 + d3);
int count = 0;
foreach (Control c in Controls)
{
if (!(c is TextBox)) continue;
TextBox t = c as TextBox;
{
if (t.Text != "00:00:00")
{
count++;
}
}
}
averagelabletext.Text = total / count;
}
{{1}}
我希望如果用户在文本框1中输入00:09:00,在文本框2中输入00:09:30,则结果应为00:09:15。
现在,如果用户输入相同的值,则返回的平均值为00:06:10,因为它仍在将第三个值计算为平均值。由于用户尚未在该框中输入值,因此仍为00:00:00。
答案 0 :(得分:1)
使用Where
过滤在进行平均值运算之前未输入的结果:
private void calculate_btn_Click(object sender, EventArgs e)
{
var d1 = TimeSpan.Parse(textBox1.Text);
var d2 = TimeSpan.Parse(textBox2.Text);
var d3 = TimeSpan.Parse(textBox3.Text);
var sourceList = new List<TimeSpan> {d1,d2,d3};
var averageTicks = sourceList.Where(t=>t.Ticks>0).Average(t=>t.Ticks);
var averageTimeSpan = new TimeSpan(averageTicks);
averagelabletext.Text = averageTimeSpan.ToString();
}
为了清楚起见,我可能会做更多类似的事情:
private void calculate_btn_Click(object sender, EventArgs e)
{
var textboxes = new List<TextBox> {textBox1, textBox2, textBox3};
var ticks = textboxes.Select(t=>TimeSpan.Parse(t.Text).Ticks);
var enteredTicks = ticks.Where(t=>t!=0);
var averageTicks = enteredTicks.Average();
var averageTimeSpan = new TimeSpan(averageTicks);
averagelabletext.Text = averageTimeSpan.ToString();
}
然后进一步简化:
private void calculate_btn_Click(object sender, EventArgs e)
{
var textboxes = new List<TextBox> {textBox1, textBox2, textBox3};
var ticks = textboxes
.Select(t=>TimeSpan.Parse(t.Text).Ticks)
.Where(t=>t!=0);
.Average();
var averageTimeSpan = new TimeSpan(ticks);
averagelabletext.Text = averageTimeSpan.ToString();
}
答案 1 :(得分:0)
尝试使用TryParse。如果仍然无法解析空字符串,请添加对!string.IsNullOrWhiteSpace(TextBox1.Text) && TimeSpan.TryParse...
private void calculate_btn_Click(object sender, EventArgs e)
{
var sourceList = new List<TimeSpan>();
TimeSpan timeSpan;
if (TimeSpan.TryParse(textBox1.Text, out timeSpan)) {
sourceList.Add(timeSpan);
}
if (TimeSpan.TryParse(textBox2.Text, out timeSpan)) {
sourceList.Add(timeSpan);
}
if (TimeSpan.TryParse(textBox3.Text, out timeSpan)) {
sourceList.Add(timeSpan);
}
var averageTimeSpan = new TimeSpan(Convert.ToInt64(sourceList.Average(x => x.Ticks)));
averagelabletext.Text = averageTimeSpan.ToString();
}