【发布时间】:2022-12-31 00:35:45
【问题描述】:
我有以下功能,我用它来查找终端累计正值和负值,它正在工作:
public class CumulativeTotal
{
[Test]
public void CalculatesTerminalValue()
{
IEnumerable<decimal> sequence = new decimal[] { 10, 20, 20, -20, -50, 10 };
var values = FindTerminalValues(sequence);
Assert.That(values.Item1, Is.EqualTo(-20));
Assert.That(values.Item2, Is.EqualTo(50));
Assert.Pass();
}
public static Tuple<decimal,decimal> FindTerminalValues(IEnumerable<decimal> values)
{
decimal largest = 0;
decimal smallest = 0;
decimal current = 0;
foreach (var value in values)
{
current += value;
if (current > largest)
largest = current;
else if (current < smallest)
smallest = current;
}
return new Tuple<decimal, decimal>(smallest,largest);
}
}
但是,为了学习,我怎么能用Linq来实现呢?
我可以看到一个包裹MoreLinq,但不知道从哪里开始!
【问题讨论】:
-
我可能混淆了术语,这本质上是一个分类帐和要添加的序列增量中的值。它至少是 -20 10 + 20 + 20 - 20 - 50 = -20(然后不会低于那个)
-
values.Aggregate((min: 0, max: 0), (ac, current) => (current < ac.min ? current : ac.min, current > ac.max : current : ac.max)) -
您应该将
smallest初始化为decimal.MaxValue并将largest初始化为decimal.MinValue这样,如果最大总和为负或最小总和为正,它仍然可以工作。 -
@AluanHaddad 那不是跟踪运行总和。
-
@juharr 我注意到他没有使用运行总和,所以我没有理会它。