Рассчитать общую сумму (либо среднее число - average) для каждого повторяющихся дня, в выбранном периоде дат, для показа графика

Рейтинг: 4Ответов: 2Опубликовано: 27.06.2023

веб приложение на блазор

Если пользователь выбирает промежуток (например) три недели на календаре, как ему показать общее/среднее число каждого понедельника, вторника итд. на графике ?

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

public DateTime DateValue { get; set; }
private DayOfWeek dayOfWeekValue { get; set; }
public DayOfWeek DayOfWeekValue { get => DateValue.DayOfWeek; set { dayOfWeekValue = value; } }

введите сюда описание изображения

Может группировку я могу изменить?

private async Task GetCalendar2()
{
    if (weighsModels != null)
    {
        chart1 = weighsModels.Where(d => d.date >= MinDate && d.date <= MaxDate).ToList();

        var groupTotalByDay = from chart in chart1

                                group chart by chart.DateValue into ChartData
                                select new ModelChart()
                                    {
                                        DateValue = ChartData.Key,
                                        YNameValue = ChartData.Sum(x => x.YNameValue),
                                    };
        chart1 = groupTotalByDay.ToList();
    }
    this.StateHasChanged();
}

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

ОЖИДАНИЯ: то есть график ВСЕГДА показывает неделю, меняются, просто данные (прибавляет YNameValue каждого одинакового дня недели) (я не понимаю зачем такое делать (все дни показать куда полезней), но это запрос клиента...)

на github выложила пример

upd: как то можно вызвать к дням функцию sum, при условии, что даты разные ?

введите сюда описание изображения

Ответы

▲ 1Принят

расчитать среднее число в таблице онлайн
пуш гихаб update

решение предложила служба syncfusion, ConvertDateTime позволила расправить график, и решить вопрос с графиком, который показывал все данные на вертикальной линии. Размещаю в виде ответа, сейчас если выбрать промежуток две недели, график считает общую сумму двух понедельников, осталось только найти Average-среднее число. Сейчас когда я применяю average вместо sum, то получаю не верные данные, тк. average расчитывает деля на количество данных, а надо делить на дни, чтоб получить то самое среднее число (переводчик переводит Average как среднее число, прошу поправить , тк в комментариях был вопрос, может не так перевела🤷‍♀️)

для примера выбираю промежуток 16-24 попадает два понедельника на 16+23 два понедельника у нас 32 (23+9) общее число

new ModelChart{ date = new DateTime(2022,05,16), YNameValue = 10, }, 
        new ModelChart{ date = new DateTime(2022,05,16), YNameValue = 5, },
        new ModelChart{ date = new DateTime(2022,05,16), YNameValue = 5, },
        new ModelChart{ date = new DateTime(2022,05,16), YNameValue = 3, }, //23
new ModelChart{ date = new DateTime(2022,05,23), YNameValue = 1, },
        new ModelChart{ date = new DateTime(2022,05,23), YNameValue = 1, },
        new ModelChart{ date = new DateTime(2022,05,23), YNameValue = 3, },
        new ModelChart{ date = new DateTime(2022,05,23), YNameValue = 4, }, //9

понедельник (lundi) равен 32 введите сюда описание изображения

private async Task GetCalendar2()
{
    if (weighsModels != null)
    {
        chart1 = weighsModels.Where(d => d.date >= MinDate && d.date <= MaxDate).ToList();

        var groupTotalByDay = from chart in chart1

        group chart by chart.date.DayOfWeek into ChartData
        select new ModelChart()
        {
            date = ConvertDateTime(ChartData.Key),   
            YNameValue = ChartData.Sum(x => x.YNameValue),
            // смотришь и думаешь, я же вроде так пробовала😹
            // а это для average
            //YNameValue = ChartData.Sum(x => x.YNameValue)/ChartData.GroupBy(chart => chart.date).Count(),
         };
         chart1 = groupTotalByDay.ToList();
     }
     this.StateHasChanged();
}

private DateTime ConvertDateTime(DayOfWeek dayOfWeek)
{
    DateTime date = DateTime.Now;
    int diff = dayOfWeek - date.DayOfWeek;
    if (diff < 0)
    {
        diff += 7;
    }
    return date.AddDays(diff);
}
▲ -1
 group chart by chart.DateValue into ChartData
 group chart by chart.DateValue.DayOfWeek into ChartData