LINQ避免特定的分组

时间:2014-07-22 00:38:05

标签: c# linq

在我的多项式类中,所有项都包含一个元组列表(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>>

2 个答案:

答案 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();