2012-11-24 49 views
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,但它似乎是錯誤的工具。最終,項目列表將會非常長,成千上萬。如此好的表現將是一個問題。

+1

以何種方式是'{ 1,2,-1,3 ...}是一個排序列表? –

+0

是的,這是一個排序列表。 (讓我更新我的問題)。 –

+0

該代碼不會編譯。 'SortedList'不會做你認爲它做的事。我建議你拿出比「粗略草案代碼」更多的東西,這樣你至少可以呈現一個現實的場景。請閱讀http://tinyurl.com/so-list –

回答

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(); 
+0

我喜歡這個解決方案。它可以變成擴展方法。也許通用以及T可能是IComparable。謝謝。 –

1

你可以做

var drawdown = items.Select(i => 
{ 
    min = Math.Min(min, i); 
    return min; 
}); 
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); 
     } 
    } 

} 
相關問題