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

标签 c# linq datatable

我有一个巨大的数据表(大约 500k-600k 行)。我想根据某些特定的列来计算行。 例如:我有 3 列名称 ID、类型和值。我想根据“类型”计算“值”列。我已经使用 DataRow Filter 完成了它 - 首先获取唯一的“ID”,然后为每个“类型”计算值。这个逻辑变得非常复杂,需要更长的时间来处理。我不太擅长 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

我正在寻找的输出是:

ID     Type          Value

2       100            11

2       200            10

3       200            17

4       100            10

4       200            15

最佳答案

我认为您正在寻找的是这样的东西。显然,我在哪里使用了 <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"))
             };

这将产生相当简单的代码,但可以说它不应该比编写良好的循环更高效(当然,如果您可以卸载相反,这对数据库来说,你通常会更好)。然而,在所有条件相同的情况下,Linq 代码经过了很好的优化并且非常高效。如果您对效率有疑问,请衡量。运行您现有的代码(如果有的话)和根据答案编写的代码,看看您的立场。

关于c# - 在 C#.net 中处理大量数据表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718190/

相关文章:

c# - 从数据表中删除除最后一行之外的所有行

c# - 将数据列添加到数据表

c# - 如何解决 'Only Parameterless constructors and initializers...' 错误

c# - 将 DefaultIfEmpty 与对象一起使用?

c# - 如何从两个值创建一个列表?

c# - 如何在数据表 c# asp.net 中同时检查第一行、第二行和第三行?

c# - 在 C# 中为图像添加颜色

c# - 没有网格的盒子对撞机和 Physics.Raycast

c# - 如何以编程方式在 Xamarin 中切换 NavigationViewControllers?

C# 性能问题 : typeof(MyClass) vs. this.GetType()