Совет дизайна. Используя DataTable или Список <MyObject> для универсального средства проверки правила

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

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

  • Смочь вычислить новые столбцы/свойства с помощью выражения
    например, Column3 = Column1 * Column2.
    В конечном счете я хотел бы смочь использовать внешние данные с помощью обратного вызова,
    например, Column3 = Column1 * GetTemperature
    Выражение относительно просто, операции математики, сумма, количество и ЕСЛИ единственные необходимые функции.
  • Смочь фильтровать/группировать данные и выполнить агрегирования
    например, Сумма (Данные. Column1), Где (Данные. Column2 == "вздор")

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

    2. Используя Список родовых объектов каждый со Словарем <строка, объект> для хранения значений.
    => Указывают 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 миллионов сканирований строки/объекта.

    Действительно ценил бы любое понимание. Спасибо.
    PS. Конечно, с помощью базы данных + SQL & Views и т.д. была бы самым легким решением, но по различным причинам не может быть реализован.

    11
    задан Andrew White 23 June 2010 в 13:49
    поделиться

    1 ответ

    Что ж, использование DataTable не исключает использования LINQ

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

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

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

    5
    ответ дан 3 December 2019 в 11:36
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: