Совет по дизайну. Использование DataTable или List <MyObject>для проверки общего правила - PullRequest
11 голосов
/ 07 июня 2010

У меня есть около 100 000 строк общих данных.Столбцы / Свойства этих данных определяются пользователем и имеют обычные типы данных (string, int, double, date).Там будет около 50 столбцов / свойств.

У меня есть 2 потребности:

Чтобы иметь возможность вычислять новые столбцы / свойства, используя выражение
например, Столбец3 = Столбец1 * Столбец2.
В конечном итоге я хотел бы иметь возможность использовать внешние данные с помощью обратного вызова,
Например, Столбец3 = Столбец1 * GetTempera *простые математические операции, сумма, число и IF являются единственными необходимыми функциями.
Для возможности фильтрации / группировки данных и выполнения агрегации
например, Sum (Data.Column1)Где (Data.Column2 == "бла")

Насколько я вижу, у меня есть два варианта:
1. Использование DataTable .
=> Точка 1 выше достигается с помощью DataColumn.Expression
=> Точка 2 выше достигается с помощью DataTable.DefaultView.RowFilter или DataTable.Select () & C # code

2. ИспользованиеСписок универсальных объектов, каждый из которых содержит Dictionary для хранения значений.
=> Точка 1 может быть достигнута с помощью чего-то вроде NCalc
=> Точка 2 достигается с помощью LINQ DataTable: Pros: DataColumn.Expression is inbuilt Cons: RowFilter & coding c# is not as "nice" as LINQ, DataColumn.Expression does not support callbacks(?) => workaround could be to get & replace external value when creating the calculated column GenericList: Pros: LINQ syntax, NCalc supports callbacks Cons: Implementing NCalc/generic calc engine Исходя из вышеизложенного, я думаю, что подход GenericList победит, но я не учел в этом факте производительность, которая по некоторым причинам, я думаю, будет лучше с данными.
Кто-нибудьВы чувствуете себя лучше с производительностью LINQ против DataTable?
Как насчет NCalc?
Как я уже сказал, существует около 100 000 строк данных с 50 столбцами, из которых может быть рассчитано 20.Всего к данным будет применено около 50 правил, поэтому в общей сложности будет выполнено 5 миллионов проверок строк / объектов. Буду признателен за любые идеи.Thx.
пс.Конечно, использование базы данных + SQL & Views и т. Д. Было бы самым простым решением, но по разным причинам не может быть реализовано.

1 Ответ

5 голосов
/ 07 июня 2010

Ну, использование DataTable не исключает использование LINQ

table.Rows.Cast<DataRow>() //IEnumerable<DataRow>, linq it to death

Этот парень приводит некоторые аргументы о HashTable против DataTable и этот парень находит Dictionary лучше, чем DataTable, но не намного (факторы в словаре создать стоимость).

Примечание: если столбцы известны заранее (то есть пользователь может выбрать некоторые из столбцов из предопределенного набора столбцов (имя, тип)), я бы пошел со строго типизированными классами, поскольку data["property"] не делает получить поддержку Intellisense, как data.Property делает.

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