使用 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));
结果显示在视图中。
问题是
如何更改此代码以减少声明,但在一行中为 sumRez
和 sumReak
调用 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
实例的方式可能有所不同,但这基本上是它的工作方式。
为了澄清我的标题,我会给你一个例子,说明我有什么和我想做什么(实际上我想重构一些代码)。
所以首先我将 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));
结果显示在视图中。 问题是
如何更改此代码以减少声明,但在一行中为 sumRez
和 sumReak
调用 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
实例的方式可能有所不同,但这基本上是它的工作方式。