设计建议.使用DataTable或List <MyObject>作为通用规则检查器

And*_*ite 11 c# linq datatable list

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

我有2个需求:

  • 能够使用表达式计算新列/属性,
    例如Column3 = Column1*Column2.
    最终我希望能够使用回调来使用外部数据,
    例如Column3 = Column1*GetTemperature
    表达式相对简单,数学运算,求和,计数和IF是唯一必需的函数.
  • 能够过滤/分组数据并执行聚合,
    例如Sum(Da​​ta.Column1)Where(Data.Column2 =="blah")

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

    .2.使用每个都带有Dictionary <string的通用对象列表, object>存储值.
    =>点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 vs. DataTable性能有直觉感受/经验?
    NCalc怎么样?
    正如我所说,大约有100,000行数据,有50列,其中可能有20列.总共将对数据运行大约50条规则,因此总共将有500万行/对象扫描.

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

  • bot*_*ked 5

    好吧,使用DataTable并不排除使用LINQ

    table.Rows.Cast<DataRow>() //IEnumerable<DataRow>, linq it to death
    
    Run Code Online (Sandbox Code Playgroud)

    这个家伙提出了一些关于HashTablevs.的争论,DataTable这个家伙发现的Dictionary好多了DataTable,但不是很多(字典中的因素创造成本).

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