c# - 使用 LINQ 从文件中高效地计算总计

标签 c# linq

我正在读取一个文件并将其中的每一行变成一个类,我们称之为 Record ,并返回每个 Record因为它是使用 IEnumerable<Record> 读取的和 yield return .

正因为如此,每当我对枚举进行操作时,我才真正开始执行这些读取,例如对其执行求和或使用 foreach 对其进行迭代.

我确实需要遍历每条记录,然后将其转换成数据库,但由于我之前的数据库设计,我需要数据库中每条记录的总计,所以我需要这些总计在我开始将它们翻译到我的数据库之前。

目前我有五个独立的.Count().Sum()在我开始迭代枚举之前对我的枚举进行操作(例如 int i = records.Sum(r => r.SomeField)int j = records.Count(r => r.IsSomethingTrue) )。这些计数或总和中的每一个都将遍历整个文件以分别计算每一个。我对这种行为不太满意,想找到一种更有效的方法。

如果有任何不同,我正在使用 .NET 3.5。

最佳答案

您可以使用自己的 struct在单次通过可枚举对象时计算一些值。

public struct ComplexAccumulator
{
    public int TotalSumField { get; set; }

    public int CountSomethingTrue { get; set; }
}

现在您可以使用 Aggreagate累积值的扩展方法:

records.Aggregate(default(ComplexAccumulator), (a, r) => new ComplexAccumulator
{
    TotalSumFiled = a.TotalSumField + r.SumField,
    CountSomethingTrue = a.CountSomethingTrue + r.IsSomethingTrue ? 1 : 0,
});

而不是 struct你可以使用合适的 Tuple例如,fe类似 Tuple<int, int, int> 的东西.

关于c# - 使用 LINQ 从文件中高效地计算总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31962756/

相关文章:

c# - 使 .NET 可执行文件在第一时间加载得更快

c# - 如何在 C# 中初始化 Data = new double[rowCount][columnCount]

c# - 使用 Asp.net MVC web.api 为什么我应该重定向而不是仅仅调用其他函数?

c# - linq 另一个列表的有序子集

C# LINQ - 将嵌套字典转换为列表

c# - 使用 Automapper 优化相关子查询

c# - 我有一个为 ViewState 赋值的控件。它有效,但 ViewState 被禁用。如何?

c# - 在大型 asp.net C# web 应用程序中修复 SQL 注入(inject)表单

c# - 使用 LINQ 选择数据到嵌套类

c# - Linq:如何在不同类型的键上连接表