有許多方法可以解決這個問題,使用al基於inq的方法。
如果你使用VB.NET 4.0,那麼你可以使用多行lambda表達式,這將給你一個解決方案最接近一個你正在嘗試:
Dim runningTotal = 0
Dim getRunningTotal As Func(Of Integer, Integer) = Function(n)
runningTotal += n
Return runningTotal
End Function
Dim results2 =
From v In results1
Select New With { .num = v.green, .running_total = getRunningTotal(v.green) }
的疑難雜症這種方法是如果您不止一次評估result2
查詢,則會計算運行總數(即繼續從上次計算)。反正你的代碼也會發生同樣的情況。
在C#中,我會爲此創建一個使用迭代器的擴展方法,但此時VB.NET不支持迭代器函數,所以我們必須選擇一些更好用的方法。
第一使用Aggregate
& Zip
擴展方法:
Dim results2 =
results1.Zip(
results1.Aggregate(
New Integer() { },
Function(tt, t) _
tt.Concat(New Integer() { tt.LastOrDefault() + t.green }).ToArray()
),
Function (r1, rt) New With { .num = r1.green, .running_total = rt }
)
是的,它的工作,但由於它需要建立連續的中間陣列的源集合中的每個元素是不高效的過分。
最後一種方法是使用由Microsoft的Rx團隊生成的System.Interactive
庫中的Scan
擴展方法。 Scan
的工作方式與Aggregate
類似,但會自動生成中間值,因此效率更高。
Dim results2 =
results1.Scan(
New With { .num = 0, .running_total = 0 },
Function (tt, t) _
New With { .num = t.green, .running_total = tt.running_total + t.green }
)
或者:
Dim results2 =
results1.Zip(
results1.Scan(0, Function(tt, t) tt + t.green),
Function (r1, rt) New With { .num = r1.green, .running_total = rt }
)
簡單,是吧?