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

时间:2019-02-01 10:42:45

标签: c# linq extension-methods

为澄清我的头衔,我将举一个例子说明我拥有的东西和我想做的事情(实际上,我想重构一些代码)。

所以首先我将对象添加到列表中

var Impedances = new List<Impedance>()

具有:

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

稍后在代码上循环遍历“ LinesOut”的大列表(搜索其他可能的Impedance对象),然后执行以下计算:

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()扩展名添加更多参数-如果是,怎么办?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以简单地使用.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实例的方式可能有所不同,但这基本上就是它的工作方式。

答案 1 :(得分:0)

您可以添加以下扩展名

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));