1

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

我的代码如下所示:

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 ,但它似乎是错误的工具。最终,项目列表将非常长,有数千个。所以良好的性能将是一个问题。

4

3 回答 3

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();
于 2012-11-24T17:12:38.077 回答
1

你可以做

var drawdown = items.Select(i =>
{
    min = Math.Min(min, i);
    return min;
});
于 2012-11-24T17:09:50.633 回答
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);
        }
    }

}
于 2012-11-24T17:38:25.863 回答