C# LINQ 和涉及大型数据集的计算

标签 c# linq performance list

这更像是一个技术性的“操作方法”或“最佳方法”问题。

我们当前需要从数据库中检索记录,将它们放入“内存中”列表中,然后对数据执行一系列计算,即最大值、平均值和一些更具体的自定义统计信息。

将数据放入“内存中”列表不是问题,因为我们使用 NHibernate 作为我们的 ORM,它在从数据库中检索数据方面做得非常出色。我正在寻求的建议是我们应该如何最好地对结果数据列表进行计算。

理想情况下,我想为每个统计数据创建一个方法,MaximumValue()、AverageValueUnder100()、MoreComplicatedStatistic() 等等。当然,将所需的变量传递给每个方法并让它返回结果。这种方法还将使单元测试变得轻而易举,并为我们提供出色的覆盖率。

如果我们对每个计算执行 LINQ 查询,是否会影响性能,或者应该在尽可能少的 LINQ 查询中合并对每个统计方法的尽可能多的调用。例如,将数据列表传递给一个名为 AverageValueBelow100 的方法,然后将整个数据列表传递给另一个方法 AverageValueBelow50 没有多大意义,因为它们可以通过一个 LINQ 查询有效地执行。

我们如何在不牺牲性能的情况下实现高级别的粒度和分离?

有什么建议……问题够清楚吗?

最佳答案

根据计算的复杂程度,最好在数据库中进行。如果它非常复杂,您需要将其作为对象引入并产生开销,您可能希望避免对结果集进行多次迭代。您可能要考虑使用聚合。参见 http://geekswithblogs.net/malisancube/archive/2009/12/09/demystifying-linq-aggregates.aspx讨论如果它。您将能够分别对每个聚合进行单元测试,然后(可能)在单个迭代中投影多个聚合。

关于C# LINQ 和涉及大型数据集的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174628/

相关文章:

c# - C# 中的位运算

C# Linq 内部连接

Mysql 查询增强

c# - 如何使用 CollectionViewSource 正确绑定(bind)(更新)DataGrid

c# - 使用通用接口(interface)创建工厂

c# - 系统.LINQ.动态 : Select (“new classname (…)” ) into a List<T> (or any other enumerable collection of <T>)

java - Java 中 if/else 与 switch 语句的相对性能差异是什么?

python - python 中上升最快的阶乘(Pochhammer 函数)

c# - 如何通过反射获取可空类型的值

c# - Contains<T>() 以及如何实现它