需要计算用户输入的多个TimeSpan值的平均值

时间:2019-03-26 20:37:42

标签: c# winforms

这是我正在使用的跑步速度/时间计算器。我遇到的这个特殊问题是找到输入的英里时间值的平均速度。我让用户通过文本框以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。

2 个答案:

答案 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();
        }