0
於第(T)名單上有對象的列表,看起來像這樣的項目:快速找到由總財產
Public Class LineItem
Public Property Name As String
Public Property Weight As Int32
Public Property Expression As String
End Class
Private _lineItems As New List(Of LineItem)
我隨機選擇一個項目像這樣:
Public Function SelectItem(ByVal name As String) As LineItem
Dim items As List(Of LineItem) = CType(Rules.Where(Function(li As LineItem) li.Name = name.Remove("[", "]")).ToList, List(Of LineItem))
Dim totalWeight As Int32 = items.Sum(Function(li As LineItem) li.Weight)
If totalWeight > 0 Then
Dim sum As Int32 = 0
Dim index As Int32 = (BaseGrammar.Random.Next Mod totalWeight) + 1
For Each item As LineItem In items
sum += CInt(item.Weight)
If sum >= index Then
Return item
End If
Next
End If
Return Nothing
End Function
雖然這對於小列表來說工作得很好,但是當列表變大時,顯然這是非常低效的。是否有一種我錯過的結構或方法可以提高效率?
這是一個很好的觀點。我想我可以緩存名稱列表和總權重,所以當我回想起這個代碼時,它會快得多。 – Lance 2014-10-07 16:11:53
爲了更新,我最終移動到了一個名稱列表和權重循環,並將它們緩存在字典中,現在速度幾乎是瞬間的。再次感謝你。 – Lance 2014-10-08 12:35:21