运行最小值列表

时间:2012-11-24 17:02:55

标签: c# linq

我希望能够迭代一个项的枚举,并在每个元素返回到目前为止迭代的最小值。

我的代码如下:

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,但它似乎是错误的工具。最终,物品清单将很长,成千上万。所以良好的表现将是一个问题。

3 个答案:

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

}