Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.147.124] |
|
Сообщ.
#1
,
|
|
|
Мною написана функция, которая выбирает уникальные значения в заданном пользователем столбце таблицы и подсчитывает количество соответствующих им уникальных значений во всех остальных столбцах.
Function statArray(ByVal dTable As DataTable, ByVal numMainCol As Integer) As System.Array 'Создаю массив имен столбцов в таблице, по которым будет произведен подсчёт статистики (все кроме основного столбца, по которому будет осуществляться группировка) Dim addCols(dTable.Columns.Count - 1) As String Dim numAddCol As Integer = 0 'Счётчик статистических столбцов For i = 0 To dTable.Columns.Count - 1 If i <> numMainCol Then numAddCol = numAddCol + 1 addCols(numAddCol) = dTable.Columns(i).ColumnName End If Next 'LINQ-запросы на подсчет статики по каждому столбцу (можно, конечно, объединить всё в один запрос, но так будет более понятно) Dim q1 = From dt In dTable _ Group dt.Field(Of Object)(addCols(1)) By f_by = dt.Field(Of Object)(dTable.Columns(numMainCol).ColumnName) _ Into cnt = Count() _ Select ff = f_by, cnt = cnt Dim q2 = From dt In dTable _ Group dt.Field(Of Object)(addCols(2)) By f_by = dt.Field(Of Object)(dTable.Columns(numMainCol).ColumnName) _ Into cnt = Count() _ Select ff = f_by, cnt = cnt Dim q3 = From dt In dTable _ Group dt.Field(Of Object)(addCols(3)) By f_by = dt.Field(Of Object)(dTable.Columns(numMainCol).ColumnName) _ Into cnt = Count() _ Select ff = f_by, cnt = cnt 'Теперь объединяющий запрос, собирающий статистику по всем столбцам в одну таблицу Dim query = From dt1 In q1 _ Join dt2 In q2 On dt2.ff Equals dt1.ff _ Join dt3 In q3 On dt3.ff Equals dt1.ff _ Select main = dt1.ff, f1 = dt1.cnt, f2 = dt2.cnt, f3 = dt3.cnt 'Возврат массива statTable = query.ToArray End Function То есть, для таблицы: Table1 F I O Year Иванов Сергей Иванович 1980 Иванов Олег Петрович 1981 Иванов Кирилл Семенович 1980 Петров Сергей Семенович 1982 Петров Кирилл Семенович 1980 Сидоров Сергей Иванович 1983 Сидоров Иван Петрович 1980 при запуске функции: Dim Itog=statArray(Table1, 0) Я получаю результат: Main fl1 fl2 fl3 Иванов 3 3 2 Петров 2 1 2 Сидоров 2 2 2 из которого видно, что на лиц с фамилией Иванов приходится 3 уникальных имени, 3 уникальных отчества и 2 уникальных года рождения и т.д. Dim Itog=StatArray(Table1, 1) выдаст: Main fl1 fl2 fl3 Сергей 3 2 3 Олег 1 1 1 Кирилл 2 1 1 Иван 1 1 1 И так далее по всем четырём столбцам. Функция работает, но только на таблицу с четырьмя столбцами. Для того, чтобы перестроить функцию под другое количество столбцов, необходимо менять код. ВОПРОС: Можно ли как-то посредством LINQ-запроса(ов) сделать аналогичную, но универсальную функцию, которая работала бы с таблицами с любым количеством столбцов и при этом выдавала бы статистику по всем столбцам аналогично, как в приведенном выше случае? |
Сообщ.
#2
,
|
|
|
LINQ-запросы на подсчет статики по каждому столбцу преобразовать в цикл, а финальный запрос переписать на Dynamic LINQ - http://code.msdn.microsoft.com/vstudio/LIN...ueries-b471d1bd
|