c# datatable значения столбца groupby и sum (без названия) - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно сделать группу по и суммировать значения для каждого столбца. На самом деле мне удалось создать таблицу данных как:

DataTable stats = dt.AsEnumerable().GroupBy(r => r["Data"]).OrderByDescending(r => r.Key).Select(g => g.OrderBy(r => r["Data"]).First()).CopyToDataTable();

В основном мне также нужно суммировать каждое значение для каждого столбца в исходной таблице данных (dt). Пожалуйста, учтите, что, за исключением пары столбцов, я могу не знать, сколько их и каково их название. В предыдущем тесте я использовал:

var query = from stat in stats
            group stat by stat.Field<string>("Data") into data
            orderby data.Key
            select new
            {
                Data = data.Key,
                TotTWorked = data.Sum(stat => stat.Field<int>("Time_Work")),
                TotTHold = data.Sum(stat => stat.Field<int>("Time_Hold")),
                TotTAlarm = data.Sum(stat => stat.Field<int>("Time_Alarm")),
                Productivity = 0,
            };  

Но теперь мне нужно быть более гибким, поэтому я не могу указать имя столбца, как указано выше. Любая помощь?

1 Ответ

1 голос
/ 29 мая 2020

Итак, если у вас есть хотя бы список имен столбцов, я бы go использовал подход создания словаря как части выбора, а затем преобразовал бы его позже в любую форму, которая вам нужна. Вот пример:

var query = from stat in stats
                        group stat by stat.Field<string>("Data") into data
                        orderby data.Key
                        select new
                        {
                            Data = data.Key,
                            SumsDictionary = listOfColumnNames
                                             .Select(colName => new { ColName = colName, Sum = data.Sum(stat => stat.Field<int>(colName)) })
                                             .ToDictionary(d => d.ColName, d => d.Sum),
                            Productivity = 0,
                        };

Чтобы, если бы вы сериализовали объект результата, он выглядел бы примерно так:

{
  "Data": {},
  "SumsDictionary": {
    "Time_Work": 10,
    "Time_Hold": 20,
    "Time_Alarm": 30
  },
  "Productivity": 0
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...