Используя .NET 3.5, мне нужно сгруппировать DataTable
несколькими столбцами, где имена столбцов содержатся в IEnumerable
.LINQ - Group DataTable несколькими столбцами, определенными во время выполнения
// column source
IEnumerable<string> columns;
DataTable table;
IEnumerable<IGrouping<object, DataRow>> groupings = table
.AsEnumerable()
.GroupBy(row => ???);
Обычно ???
бы анонимный тип, как описано here, но мне нужно использовать columns
в качестве источника столбца. Это возможно?
мне пришлось добавить бросок в проекции, чтобы заставить его работать: 'Func, строка> F = (строка, COLS) => string.join ("|", cols.Select (col => (string) row [col]). ToArray()); '- но мне интересно, можете ли вы объяснить, как эта строка действительно работает? '.GroupBy (строка => f (строка, столбцы))' - функция возвращает строку, но если вы замените ее на строку, она не сработает! Как известно группе, чтобы посмотреть на значения столбцов после того, как она построила строку в func? Я был бы счастлив, если бы вы могли указать мне на любые ресурсы, объясняющие это. –
@ Джанна рада, что это помогло. Причина, по которой он работает, состоит в том, что строка, возвращаемая функцией, не просто «любая строка», это строка, содержащая значения столбца. Если значения столбцов совпадают для любых двух строк, то строки будут совпадать, и они будут «сгруппированы». –
, поэтому он выполняет '(row => f (row, columns))', заканчивается значениями, такими как 'row => 1 | 10' или' row => 2 | 987', и они становятся ключами для группировок, так что если какой-либо из них повторяется, он будет сгруппирован с предыдущим. Хорошо, это имеет смысл. Благодаря! –