Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ/扩展方法从一个列表中同时添加两个不同的值_C#_Linq_Extension Methods - Fatal编程技术网

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

C# 使用LINQ/扩展方法从一个列表中同时添加两个不同的值,c#,linq,extension-methods,C#,Linq,Extension Methods,为了澄清我的标题,我将给你一个例子,说明我拥有什么以及我想做什么(实际上我想重构一些代码) 因此,首先我将对象添加到列表中: var阻抗=新列表() 与: 阻抗。添加(新阻抗(R,X))-R和X是双值 稍后,代码循环通过一个大列表“LinesOut”(搜索其他可能的阻抗对象),然后进行此计算: var sumRez = Impedances.Select(x => x.R).Sum(); var sumReak = Impedances.Select(y => y.X).Sum();

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

因此,首先我将对象添加到列表中:

var阻抗=新列表()

与:

阻抗。添加(新阻抗(R,X))
-R和X是双值

稍后,代码循环通过一个大列表“LinesOut”(搜索其他可能的阻抗对象),然后进行此计算:

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

您只需使用
.Aggregate
(用于获取一系列值并将其减少为单个值):


创建一个新的
阻抗
实例的方式可能会有所不同,但它基本上就是这样工作的。

“少声明”是一个特殊的术语,您在这里真正想要什么?您的代码可以正常工作,为什么要更改它?原因是我认为我的代码可能难以添加阻抗()对象的值,因为查找阻抗()对象需要时间。@balttazar“finding”?真的不清楚你在问什么,听起来像是XY问题。考虑用实际的例子更新你的帖子,用代码清楚地定义这个问题。现在的代码是好的-所有的
聚合
/
GroupBy
常量技巧都效率较低。我知道这是可行的,但你仍然将所有
阻抗.R
添加到一个变量中,而
阻抗.X
也是如此。我想要的是,因为我很好奇,是否有可能以某种LINQ代码或扩展方法的形式进行添加。例如(我知道语法是错误的):阻抗。选择((x,y)=>(x.R.Sum(),(y.x.Sum())你能解释一下为什么要聚集吗?不管怎样,它工作得很好。
var sumImpedance = Impedances.SumImpedance();
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sumImpedance.R, sumImpedance.X));
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));