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 に答える