在C#.net中处理巨大数据表的有效方法

dpa*_*pac 1 c# linq datatable

我有一个巨大的dataTable(大约500k-600k行).我想根据某些特定列计算行数.例如:我有3列名称ID,类型和值.我想根据'Type'计算'value'列.我使用DataRow Filter完成了它 - 首先获取唯一的'ID',然后为每个'type'计算值.这种逻辑非常复杂,需要更长的时间来处理.我在LINQ中不是很好,所以我想知道我是否可以使用LINQ或其他任何方式更好地做到这一点?

数据表:

ID       type      value  
--------------------------------
2         100         5

2         100         6

2         200         10

3         200         8

3         200         9

4         100         10

4         200         15
Run Code Online (Sandbox Code Playgroud)

我正在寻找的输出是:

ID     Type          Value

2       100            11

2       200            10

3       200            17

4       100            10

4       200            15
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 5

我认为你要找的是这样的.显然,在我使用过的地方<int>,您需要根据需要更换适当的类型.

var output = from row in table.AsEnumerable()
             let id = row.Field<int>("ID")
             let type = row.Field<int>("type")
             group row by new { id, type } into grp 
             select new 
             {
                 ID = grp.Key.id,
                 Type = grp.Key.type,
                 Value = grp.Sum(r => r.Field<int>("value"))
             };
Run Code Online (Sandbox Code Playgroud)

这将导致相当简单的代码,但它不应该比一个编写良好的循环更有效(当然,如果你可以将它卸载到数据库,你通常会更好).但是,所有事情都是平等的,Linq代码非常优化和高效.如果您对效率有疑问,请进行衡量.运行现有代码(如果有的话)和答案代码,看看你的位置.