我正在读取一个文件并将其中的每一行变成一个类,我们称之为 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/