gpt4 book ai didi

c# - 设计建议。使用 DataTable 或 List 作为通用规则检查器

转载 作者:可可西里 更新时间:2023-11-01 08:48:05 25 4
gpt4 key购买 nike

我有大约 100,000 行通用数据。此数据的列/属性是用户可定义的,并且是常用数据类型(字符串、整数、 double 、日期)。将有大约 50 个列/属性。

我有两个需求:

  • 能够使用表达式计算新的列/属性
    例如Column3 = Column1 * Column2.
    最终,我希望能够通过回调来使用外部数据,
    例如Column3 = Column1 * 获取温度
    表达式比较简单,数学运算,sum, count & IF 是唯一需要的函数。
  • 能够过滤/分组数据并执行聚合
    例如Sum(Data.Column1) Where(Data.Column2 == "blah")

    据我所知,我有两个选择:
    1. 使用DataTable
    => 上面的第 1 点是通过使用 DataColumn.Expression
    实现的 => 上面的第 2 点是通过使用 DataTable.DefaultView.RowFilter 或 DataTable.Select() 和 C# 代码实现的

    2. 使用一个通用对象列表,每个对象都有一个字典 来存储值。
    => 第 1 点可以通过像 NCalc 这样的东西来实现
    => 第 2 点是使用 LINQ

    实现的
    DataTable:Pros: DataColumn.Expression is inbuiltCons: 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 columnGenericList:Pros: LINQ syntax, NCalc supports callbacksCons: Implementing NCalc/generic calc engine

    基于以上所述,我认为 GenericList 方法会胜出,但我没有考虑的是性能,出于某种原因我认为使用数据表会更好。
    有没有人对 LINQ 与 DataTable 性能有直觉/经验?
    NCalc 怎么样?
    正如我所说,大约有 100,000 行数据,50 列,其中可能有 20 列是计算出来的。总共将针对数据运行大约 50 条规则,因此总共将有 500 万行/对象扫描。

    非常感谢任何见解。谢谢。
    附言。当然使用数据库+SQL & Views等是最简单的解决方案,但由于种种原因无法实现。

  • 最佳答案

    嗯,使用 DataTable 并不排除使用 LINQ

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

    This guyHashTableDataTablethis guy 进行了一些争论发现 DictionaryDataTable 好,但相差不大(Dictionary 中的因素会产生成本)。

    注意:如果列是事先已知的(也就是说,用户可以从一组预定义的列(名称,类型)中选择一些列),我会选择强类型类,因为 data[ "property"] 不像 data.Property 那样获得 Intellisense 支持。

    关于c# - 设计建议。使用 DataTable 或 List<MyObject> 作为通用规则检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2988685/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com