当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《设计建议.使用DataTable或List<MyObject>作为通用规则检查器》经验,为你挑选了1个好方法。

我有大约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 的通用对象列表, 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等将是最简单的解决方案,但由于各种原因无法实现.

bottlenecked.. 5

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

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

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

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



1> bottlenecked..:

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

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

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

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有