Необходимо рассчитать среднее значение нескольких значений TimeSpan, введенных пользователем - PullRequest
0 голосов
/ 26 марта 2019

Это калькулятор скорости бега / времени, над которым я работаю.Эта конкретная проблема, с которой я столкнулся, заключается в поиске среднего темпа для введенных значений времени в милях.У меня есть пользователь, чтобы ввести несколько значений в формате чч: мм: сс через текстовые поля.Мне нужно сложить значения вместе, найти среднее значение введенных значений и вернуть это среднее значение метке в формате чч: мм: сс.Я пробовал разные способы сделать это и читать несколько других постов, но продолжаю зацикливаться.

  • Я пробовал использовать Список, но количество вводимых значений всегда варьируется, мне нужно этобыть динамичнымЕсли есть способ ввести только определенные пользователем значения в список, мой список будет работать.На данный момент он получает среднее значение всех моих ящиков, даже если один из них не имеет значения.

  • Также попытался просто сложить значения 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);

            var sourceList = new List<TimeSpan>();

            sourceList.Add(d1);
            sourceList.Add(d2);
            sourceList.Add(d3);

            var averageTimeSpan = new TimeSpan(Convert.ToInt64(sourceList.Average(timeSpan => timeSpan.Ticks)));
            averagelabletext.Text = averageTimeSpan.ToString();
        }

    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;
    }

Я ожидаю, что если пользователь введет 00:09:00 в textbox1 и 00:09:30 в textbox 2, результат должен быть 00: 09: 15.

Прямо сейчас, если пользователь вводит те же самые значения, возвращаемое среднее значение составляет 00:06:10, поскольку оно все еще вычисляет это третье значение в среднее значение.Поскольку пользователь не ввел значение в это поле, оно по-прежнему 00: 00: 00.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Отфильтруйте результаты, которые не были введены до выполнения усреднения, с помощью 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();
}
0 голосов
/ 26 марта 2019

Попробуйте использовать 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...