2015-12-11 14 views
1

我有一個PTO對象列表,它有兩個屬性AllowedHours和TakenHours。 我需要從應計銀行減去PTO,直到它們達到0,然後移動到下一個銀行。如何有效地從一個數字列表直到0

此代碼有效,但它看起來有辦法更有效地做到這一點?也許只有通過linq才能做到這一點?

var requestedHours = requestDetail.Hours; 
while (requestedHours > 0) 
{ 
    var accrualBank = employeeAccruals.First(e => (e.AllowedHours - e.TakenHours) > 0); 
    var hoursAvailable = accrualBank.AllowedHours - accrualBank.TakenHours; 

    if (hoursAvailable > requestedHours) 
    { 
     accrualBank.TakenHours += requestedHours; 
     requestedHours = 0; 
    } 
    else 
    { 
     accrualBank.TakenHours = accrualBank.AllowedHours; 
     requestedHours -= hoursAvailable; 
    } 
} 
+4

這將是很好,如果你能解釋一下你所說的「更有效地」的意思。你的意思是更快的代碼執行,更少的代碼行數,更低的功耗或者我忘記的其他東西?根據你的意思是「效率」,你會(可能)得到一些答案。 :-) –

+1

什麼是'employeeAccruals' - '列表'? –

+0

employeeAccruals是PTO accurals列表 –

回答

2

我不認爲這是一個Linq候選人。實際上,從代碼角度看,代碼中只有employeeAccruals.First(...這部分代碼是無效的。平原for環路將是最快的,但我建議以下爲IMO最平衡的解決方案

foreach (var accrualBank in employeeAccruals) 
{ 
    var takeHours = Math.Min(requestedHours, accrualBank.AllowedHours - accrualBank.TakenHours); 
    accrualBank.TakenHours += takeHours; 
    requestedHours -= takeHours; 
    if (requestedHours == 0) break; 
} 
+0

我剛剛寫下了這個,這是完美的謝謝 –

+0

我甚至都沒有想到foreach加上一個 –

相關問題