我希望找出一種方法來寫下帶有擴展功能的功能樣式。理想情況下,與迭代/循環版本相比,這種功能風格會表現得很好。我猜測沒有辦法。可能是因爲有許多額外的函數調用和堆棧分配等等。C#中這個迭代算法有更好的功能版本嗎?
基本上我認爲使它變得麻煩的模式是它既計算一個用於謂詞的值,然後再次需要該計算值作爲由此產生的集合。
// This is what is passed to each function.
// Do not assume the array is in order.
var a = (0).To(999999).ToArray().Shuffle();
// Approx times in release mode (on my machine):
// Functional is avg 20ms per call
// Iterative is avg 5ms per call
// Linq is avg 14ms per call
private static List<int> Iterative(int[] a)
{
var squares = new List<int>(a.Length);
for (int i = 0; i < a.Length; i++)
{
var n = a[i];
if (n % 2 == 0)
{
int square = n * n;
if (square < 1000000)
{
squares.Add(square);
}
}
}
return squares;
}
private static List<int> Functional(int[] a)
{
return
a
.Where(x => x % 2 == 0 && x * x < 1000000)
.Select(x => x * x)
.ToList();
}
private static List<int> Linq(int[] a)
{
var squares =
from num in a
where num % 2 == 0 && num * num < 1000000
select num * num;
return squares.ToList();
}
'迭代'將'n'加到'方塊',而不是「方塊」。這是打算嗎? – dtb
不要執行'n * n',首先計算'sqrt(1000000)'(對於常量/變量),並在比較中使用它。我不打算說它會爲這裏的表演做任何事情,但是在某些情況下可以倒過來數學。 (假設'n'是肯定的。) – 2012-06-21 16:39:31
@dtb你說得對,我的錯。它應該收集廣場。這就是預期的。 – lucidquiet