Мне нужно вычислить среднее значение разницы дат всех моих строк в dataGridView.

Я реализовал NodaTime (который намного проще, чем традиционные методы для расчета разницы в датах), и я сделал это просто, чтобы попробовать:

var date1 = new LocalDate(2013, 1, 29);
var date2 = new LocalDate(2018, 1, 23);
Period period = Period.Between(date1, date2.PlusDays(1));
label1.Text = string.Format("{0} anos, {1} meses e {2} dias", period.Years, 
period.Months, period.Days);

Теперь, что мне делать, чтобы получить обе даты dataGridView, вычислить в каждой строке разницу дат и со всеми вычислить среднее значение? Я хочу, чтобы это отображалось годами, месяцами и днями. Спасибо.

1
CaldeiraG 13 Мар 2018 в 17:03

2 ответа

Лучший ответ

К сожалению, реальной концепции среднего значения Period нет, поскольку они даже не сопоставимы напрямую. Например, «1 месяц» длиннее или короче «29 дней»? Это зависит от месяца. Переходя к среднему значению, какой из двух периодов «1 месяц» и «29 дней»? Нет ничего очевидного, как полезный ответ на этот вопрос, ИМО.

Что вы могли сделать, так это получить разницу всего в днях (возможно, используя Period.Between и указав PeriodUnits.Days), а затем найдите среднее количество дней. Это имеет логический смысл, и его намного легче определить, чем среднее значение лет / месяцев / дней.

3
Jon Skeet 13 Мар 2018 в 19:05

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

Предположим, для этого теста у вас есть сетка на форме.

Добавьте даты в столбцы вашей сетки. Я использую столбцы 0 и 1 для двух дат.

private void Form1_Load(object sender, EventArgs e)
{
        dgGridView.Rows.Add(new DataGridViewRow());
        dgGridView.Rows.Add(new DataGridViewRow());
        dgGridView.Rows.Add(new DataGridViewRow());

        dgGridView.Rows[0].Cells[0].Value = "Feb 01 2018 00:00:00";
        dgGridView.Rows[0].Cells[1].Value = "Feb 03 2018 06:00:45";
        dgGridView.Rows[1].Cells[0].Value = "Feb 02 2018 17:00:00";
        dgGridView.Rows[1].Cells[1].Value = "Feb 03 2018 21:54:21";
        dgGridView.Rows[2].Cells[0].Value = "Feb 04 2017 10:00:00";
        dgGridView.Rows[2].Cells[1].Value = "Feb 07 2018 08:23:26";
}

Вы можете рассчитать средние значения, нажав кнопку или какой-либо другой механизм. Это делается путем подсчета секунд, прошедших между каждым диапазоном дат, а затем деления их на количество строк.

var totalSeconds = 0.0;

 foreach (DataGridViewRow row in dgGridView.Rows)
 {
    var date1 = Convert.ToDateTime(row.Cells[0].Value);
    var date2 = Convert.ToDateTime(row.Cells[1].Value);
    var diff = (date2 - date1).TotalSeconds;

    row.Cells[2].Value = diff;
    totalSeconds += diff;
}

var totalRows = 3;
var aveSeconds = totalSeconds / totalRows;

TimeSpan aveTime = TimeSpan.FromSeconds(aveSeconds);

var totDays = aveTime.Days;
var totHours = aveTime.Hours;
var totMins = aveTime.Minutes;
var totSeconds = aveTime.Seconds;

var ave = $"Days:{totDays} Hours:{totHours} Mins:{totMins} Seconds:{totSeconds}";

Затем вы можете получить объект TimeSpan из этих общих секунд и извлечь количество дней, часов, минут и секунд для среднего.

Думаю, это работает. Заранее извиняюсь, если какой-нибудь зоркий человек заметит недостаток, но я надеюсь, что это поможет вам на вашем пути.

Благодарность

0
Wheels73 13 Мар 2018 в 15:17