设计建议。使用DataTable或List <myobject>作为通用规则检查器</myobject>

时间:2010-06-07 10:29:20

标签: c# linq list datatable

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

我有2个需求:

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

    据我所知,我有两种选择:
    1.使用 DataTable
      =&GT;上面的第1点是通过使用DataColumn.Expression实现的   =&GT;上面的第2点是通过使用DataTable.DefaultView.RowFilter或DataTable.Select()&amp;来实现的。 C#代码

    2.使用每个都带有字典&lt;的通用对象列表string,object&gt; 来存储值   =&GT;第1点可以通过像NCalc这样的东西来实现   =&GT;使用LINQ

    实现第2点
    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万行/对象扫描。

    非常感谢任何见解。 THX。
    PS。当然使用数据库+ SQL&amp;视图等是最简单的解决方案,但由于各种原因无法实现。

  • 1 个答案:

    答案 0 :(得分:5)

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

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

    This guyHashTableDataTablethis guy的一些争论发现Dictionary优于DataTable,但不是很多(因素)在字典中创建成本)。

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