2009-12-03 71 views
0

這個問題被問在interview.I需要從陣列C# - 運行()總使用聚合

(IE)

int[] array={10,20,30}; 

Expected output 

10 
30 
60 
運行總量( 只用骨料()

當我使用骨料(我施加一些最壞邏輯

array.Aggregate((a, b) => { Console.WriteLine(a + b); return (a + b); }); 

1)It prints 30,60,對我來說沒有使用return(a + b)。

2)爲了打印10,我必須通過添加元素零 (即{0,10,20,30})來修改數組。

有沒有什麼整潔的工作可以把它變成?

+3

無論誰要求你這樣做,都不使用序列運算符的良好編碼實踐。 「聚合」應該返回一個標量值,這就是它應該做的;它不應該產生副作用。如果你想要產生的是「累計運行總數序列」,那麼不要使用Aggregate;寫一個新的序列運算符「累加」並使用它。 – 2009-12-03 15:20:11

回答

5

嘗試array.Aggregate(0, (a, b) => { Console.WriteLine(a + b); return (a + b); });代替:-)

2

Aggregate有略有不同其他重載 - 看看這個例子:http://msdn.microsoft.com/en-us/library/bb549218.aspx

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source, 
    TAccumulate seed, 
    Func<TAccumulate, TSource, TAccumulate> func) 
1

,則應指定種子值設爲0:

int[] array = { 10, 20, 30 }; 
array.Aggregate(0, (a, b) => { Console.WriteLine(a + b); return a + b; }); 

這將輸出你的期望。

1
array.Aggregate(0, (a, b) => 
{ 
    Console.WriteLine(a + b); 
    return a + b; 
}); 
1
array.Aggregate(0, (progress, next) => { Console.WriteLine(progress + next); return (progress + next); }); 

使用聚合的版本開始與種子值聚集,而不是開始與第一對聚集。