在我的多项式类中,所有项都包含一个元组列表(double,uint),表示系数和指数;一个真实和自然的数字。 +运算符实现效果很好,但我想知道我是否可以避免写两次grouping.Sum(s => s.Item1)
它感觉不太好,但我似乎找不到绕过它的方法。
以下是代码:
public static tuplePolynomial operator +(tuplePolynomial tp1, tuplePolynomial tp2)
{
tuplePolynomial Result = new tuplePolynomial();
Result.Terms =
(
from t in tp1.Terms.Concat(tp2.Terms)
group t by t.Item2 into grouping
where grouping.Sum(s => s.Item1) != 0.0
select new Tuple<double, uint>(grouping.Sum(s => s.Item1), grouping.Key)
).ToList();
return Result;
}
我实际上合并了两个polymonial的术语,并将术语与相同的指数分组以对它们求和。我用零指数过滤掉了这些术语。 Terms
的类型为List<Tuple<double,uint>>
。
答案 0 :(得分:1)
使用let
子句很容易:
from t in tp1.Terms.Concat(tp2.Terms)
group t by t.Item2 into grouping
let sum = grouping.Sum(s => s.Item1)
where sum != 0.0
select new Tuple<double, uint>(sum, grouping.Key)
答案 1 :(得分:0)
您可以将where
条件移到外面并在投射新元组后应用它。
然后,您只需对每个组应用Sum
运算符,并在调用ToList
之前过滤掉所得的零和。
代码看起来像:
Result.Terms = ( ... ).Where(t => t.Item1 != 0).ToList();