使用 LINQ/Extension 方法一次从一个列表中添加两个不同的值

Adding two different values at once from one list using LINQ/Extension Method

为了澄清我的标题,我会给你一个例子,说明我有什么和我想做什么(实际上我想重构一些代码)。

所以首先我将 objects 添加到列表中:

var Impedances = new List<Impedance>()

与:

Impedances.Add(new Impedance (R,X)) - R 和 X 是双精度值。

稍后,代码会循环遍历 'LinesOut' 的大列表(搜索其他可能的阻抗 objects),然后进行以下计算:

var sumRez = Impedances.Select(x => x.R).Sum();
var sumReak = Impedances.Select(y => y.X).Sum();
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sumRez, sumReak));

结果显示在视图中。 问题是

如何更改此代码以减少声明,但在一行中为 sumRezsumReak 调用 Sum()。我是否应该向 Select() 扩展添加更多参数 - 如果是,如何?

提前致谢。

您可以添加以下扩展

public static class ImpedanceExtensions
{
    public static Impedance SumImpedance(this IEnumerable<Impedance> collection)
    {
        var totalImpedance = new Impedance();

        foreach (Impedance impedance in collection)
        {
            totalImpedance.X += impedance.X;
            totalImpedance.R += impedance.R;
        }

        return totalImpedance;
    }
}

用法

var sumImpedance = Impedances.SumImpedance();
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sumImpedance.R, sumImpedance.X));

您可以简单地使用 .Aggregate(用于获取一系列值并将其缩减为单个值):

var sums = Impedances.Aggregate((i0, i1) => new Impedance() { R = i0.R + i1.R, X = i0.X + i1.X });
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sums.R, sums.X));

创建新 Impedance 实例的方式可能有所不同,但这基本上是它的工作方式。