我希望能够迭代一个项的枚举,并在每个元素返回到目前为止迭代的最小值。
我的代码如下:
var items = new List<int>{1, 2, -1, 3, -2, 1, 1, 2, -1, -3};
var min = items.First();
var drawdown = items.Select(i =>
{
if(i < min)
{
min = i;
return i;
}
else
{
return min;
}
});
因此对于值1, 2, -1, 3, -2, 1, 1, 2, -1, -3
结果列表如下所示:
1
1
-1
-1
-2
-2
-2
-2
-2
-3
但这不是很优雅。有没有更容易阅读(linq?)这样做的方式?我查看了Aggregate,但它似乎是错误的工具。最终,物品清单将很长,成千上万。所以良好的表现将是一个问题。
答案 0 :(得分:2)
您可以使用迭代器块编写方法:
private IEnumerable<int> RunningMinimum(IEnumerable<int> ints)
{
int minimum = int.MaxValue;
foreach (int x in ints)
{
if (x < minimum) { minimum = x; }
yield return minimum;
}
}
请致电如下:
int[] drawdown = RunningMinimum(items).ToArray();
答案 1 :(得分:1)
你可以做到
var drawdown = items.Select(i =>
{
min = Math.Min(min, i);
return min;
});
答案 2 :(得分:0)
class Program
{
static void Main(string[] args)
{
var items = new[] { 1, 2, -1, 3, -2, 1, 1, 2, -1, -3 };
int min = items.First();
Action<int> minimumSoFar = (int x) => { Console.WriteLine("{0}", Math.Min(min, x)); min = Math.Min(min, x); };
foreach (var integer in items)
{
minimumSoFar.Invoke(integer);
}
}
}