2011-03-02 105 views
0

如何在results1中獲得計算列綠色的results2中的running_total。我的代碼如下沒有產生所需的結果。謝謝。在計算列上運行總計

num running_total 
----------------- 

0 True 
0 True 
0 True 
0 True 
0 True 
0 True 
0 True 
1 False 
1 False 
1 False 
1 False 
1 False 
0 True 
1 False 
1 False 
1 False 


Sub Main 

    Dim runT1 As integer 

    Dim results1= //some code 

    Dim results2= 
    From v in results1 
    Select New With {.num = v.green, .running_total = (runT1 = runT1 + v.green)} 

    results2.dump() 

End Sub 

回答

0

這已經有一段時間,因爲這個問題是問,你很可能現在解決了這一點,但是,萬一......

我懷疑你的問題實際上是VB使用「= 「既用於布爾比較,也用於賦值。

如果您有:

.running_total = (runT1 = runT1 + v.green) 

VB是處理它同C#代碼,上面寫着:

.running_total = (runT1 == (runT1 + v.green)) 

我沒有在相當一段時間內使用VB.net,但是,如果支持+ =運算符,請嘗試使用該運算符,例如

.running_total = (runT1 += v.green) 
2

有許多方法可以解決這個問題,使用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 } 
    ) 

簡單,是吧?